黑马程序员技术交流社区

标题: Python基础知识day07文件操作、综合应用(下) [打印本页]

作者: 小江哥    时间: 2018-9-14 11:22
标题: Python基础知识day07文件操作、综合应用(下)
本帖最后由 小江哥 于 2018-9-14 11:22 编辑

文件的定位读写


什么是定位?






<1>获取当前读写的位置


在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
   
[Python] 纯文本查看 复制代码
# 打开一个已经存在的文件    f = open("test.txt", "r")    
str = f.read(3)   
print "读取的数据是 : ", str   
# 查找当前位置   
position = f.tell()   
print "当前文件位置 : ", position   
str = f.read(3)    print "读取的数据是 : ", str   
# 查找当前位置   
position = f.tell()   
print "当前文件位置 : ", position   
f.close()

<2>定位到某个位置


如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()seek(offset, from)有2个参数
demo:
把位置设置为:从文件开头,偏移5个字节
[Python] 纯文本查看 复制代码
    # 打开一个已经存在的文件    
f = open("test.txt", "r")   
str = f.read(30)   
print "读取的数据是 : ", str   
# 查找当前位置   
position = f.tell()   
print "当前文件位置 : ", position   
# 重新设置位置   
f.seek(5,0)   
# 查找当前位置   
position = f.tell()   
print "当前文件位置 : ", position   
f.close()


demo:
把位置设置为:离文件末尾,3字节处
[Python] 纯文本查看 复制代码
# 打开一个已经存在的文件   
f = open("test.txt", "r")   
# 查找当前位置   
position = f.tell()   
print "当前文件位置 : ", position   
# 重新设置位置    f.seek(-3,2)   
# 读取到的数据为:文件最后3个字节数据   
str = f.read()   
print "读取的数据是 : ", str   
f.close()



文件的相关操作

有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能


1. 文件重命名

os模块中的rename()可以完成对文件的重命名操作
rename(需要修改的文件名, 新的文件名)
[Python] 纯文本查看 复制代码
import os

    os.rename("毕业论文.txt", "毕业论文-最终版.txt")


2. 删除文件

os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)
[Python] 纯文本查看 复制代码
import os

    os.remove("毕业论文.txt")


3. 创建文件夹

[Python] 纯文本查看 复制代码
 import os

    os.mkdir("张三")


4. 获取当前目录

[Python] 纯文本查看 复制代码
import os

    os.getcwd()

5. 改变默认目录

[Python] 纯文本查看 复制代码
   import os

    os.chdir("../")

6. 获取目录列表

[Python] 纯文本查看 复制代码
 import os

    os.listdir("./")

7. 删除文件夹

[Python] 纯文本查看 复制代码
 import os

    os.rmdir("张三")


应用:批量修改文件名

<1>运行过程演示

运行程序之前

运行程序之后


<2>参考代码

     
[Python] 纯文本查看 复制代码
#coding=utf-8
    # 批量在文件名前加前缀
    import os
    funFlag = 1 # 1表示添加标志  2表示删除标志
    folderName = './renameDir/'
    # 获取指定路径的所有文件名字
    dirList = os.listdir(folderName)
    # 遍历输出所有文件名字
    for name in dirList:
        print name
        if funFlag == 1:
            newName = '[东哥出品]-' + name
        elif funFlag == 2:
            num = len('[东哥出品]-')
            newName = name[num:]
        print newName
        os.rename(folderName+name, folderName+newName)

综合应用:学生管理系统(文件版)
[Python] 纯文本查看 复制代码
import timeimport os
# 定一个列表,用来存储所有的学生信息(每个学生是一个字典)
info_list = []
def print_menu():
    print("---------------------------")
    print("      学生管理系统 V1.0")
    print(" 1:添加学生")
    print(" 2:删除学生")
    print(" 3:修改学生")
    print(" 4:查询学生")
    print(" 5:显示所有学生")
    print(" 6:保存数据")
    print(" 7:退出系统")
    print("---------------------------")
def add_new_info():
    """添加学生信息"""
    global info_list
    new_name = input("请输入姓名:")
    new_tel = input("请输入手机号:")
    new_qq = input("请输入QQ:")
    for temp_info in info_list:
        if temp_info['name'] == new_name:
            print("此用户名已经被占用,请重新输入")
            return  # 如果一个函数只有return就相当于让函数结束,没有返回值
    # 定义一个字典,用来存储用户的学生信息(这是一个字典)
    info = {}
    # 向字典中添加数据
    info["name"] = new_name
    info["tel"] = new_tel
    info["qq"] = new_qq
    # 向列表中添加这个字典
    info_list.append(info)
def del_info():
    """删除学生信息"""
    global info_list
    del_num = int(input("请输入要删除的序号:"))
    if 0 <= del_num < len(info_list):
        del_flag = input("你确定要删除么?yes or no")
        if del_flag == "yes":
            del info_list[del_num]
    else:
        print("输入序号有误,请重新输入")
def modify_info():
    """修改学生信息"""
    global info_list
    modify_num = int(input("请输入要修改的序号:"))
    if 0 <= modify_num < len(info_list):
        print("你要修改的信息是:")
        print("name:%s, tel:%s, QQ:%s" % (info_list[modify_num]['name'],
            info_list[modify_num]['tel'],info_list[modify_num]['qq']))
        info_list[modify_num]['name'] = input("请输入新的姓名:")
        info_list[modify_num]['tel'] = input("请输入新的手机号:")
        info_list[modify_num]['qq'] = input("请输入新QQ:")
    else:
        print("输入序号有误,请重新输入")
def search_info():
    """查询学生信息"""
    search_name = input("请输入要查询的学生姓名:")
    for temp_info in info_list:
        if temp_info['name'] == search_name:
            print("查询到的信息如下:")
            print("name:%s, tel:%s, QQ:%s" % (temp_info['name'],
                temp_info['tel'], temp_info['qq']))
            break
    else:
        print("没有您要找的信息....")
def print_all_info():
    """遍历学生信息"""
    print("序号\t姓名\t\t手机号\t\tQQ")
    i = 0
    for temp in info_list:
        # temp是一个字典
        print("%d\t%s\t\t%s\t\t%s" % (i, temp['name'], temp['tel'], temp['qq']))
        i += 1
def save_data():
    """加载之前存储的数据"""
    f = open("info_data.data", "w")
    f.write(str(info_list))
    f.close()
def load_data():
    """加载之前存储的数据"""
    global info_list
    f = open("info_data.data")
    content = f.read()
    info_list = eval(content)
    f.close()
def main():
    """用来控制整个流程"""
    # 加载数据(1次即可)
    load_data()
    while True:
        # 1. 打印功能
        print_menu()
        # 2. 获取用户的选择
        num = input("请输入要进行的操作(数字):")
        # 3. 根据用户选择,做相应的事情
        if num == "1":
            # 添加学生
            add_new_info()
        elif num == "2":
            # 删除学生
            del_info()
        elif num == "3":
            # 修改学生
            modify_info()
        elif num == "4":
            # 查询学生
            search_info()
        elif num == "5":
            # 遍历所有的信息
            print_all_info()
        elif num == "6":
            # 保存数据到文件中
            save_data()
        elif num == "7":
            # 退出系统
            exit_flag = input("亲,你确定要退出么?~~~~(>_<)~~~~(yes or no) ")
            if exit_flag == "yes":
                break
        else:
            print("输入有误,请重新输入......")
        input("\n\n\n按回车键继续....")
        os.system("clear")  # 调用Linux命令clear完成清屏
# 程序的开始
main()


注意:
· 以上程序,在运行之前请先建立info_data.data文件,并且写入一对中括号[]即可
· 等到后面讲解完异常之后就解决了这个问题

作业

1. 读取一个文件,显示除了以井号(#)开头的行以外的所有行
2. 制作一个"密码薄",其可以存储一个网址(例如 www.itcast.cn),和一个密码(例如 123456),请编写程序完成这个“密码薄”的增删改查功能,并且实现文件存储功能




作者: Yin灬Yan    时间: 2018-9-22 17:55
nice 和前一篇续上了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2