文件处理
''' 什么是文件? 操作系统将复杂的硬件操作包装成一个简易的接口 为什么操作文件? 人或程序需要永久的存储数据 ''' # 通过Python代码来操作文件 # 打开文件 open(r"D:pyday07111.txt",encoding='utf-8') # 操作系统,默认编码为gbk # r 取消转义 # f = open(r"D:pyday07111.txt",encoding='utf-8') # f为文件对象.f也是一个变量名 # print(f.read()) # 将文件中的内容全部读出 # f.close() # 告诉操作系统将文件关闭 # 这样每次用完文件都要告诉操作系统关闭文件太过麻烦.接下来介绍一种比较简单的方法 # with open(r"D:pyday07111.txt",encoding='utf-8') as f: f仅仅是个变量名,可以把它理解为遥控器 # print(f) # print(f.read()) # 文件打开方式: # r 只读 # w 只写 # a 追加写模式 # 操作文件单位方式 # t 文本文件 文本文件在使用是一定要标明encoding模式.不然会采用系统默认编码GBk # b 二进制 一定不能标明encoding 该模式是直接用二进制进行传输 # mod参数可以不写,默认情况下是rt模式 如果只写了r w a默认情况下rt wt at # with open(r'D:pyday07111.txt',mode = 'r',encoding='utf-8') as f: # print(f.readable()) # 可读 # f.write('aaaaa') # 直接报错,在r模式下只能读 # r 模式下打开文件,如果文件不存在直接报错 # with open(r'D:pyday07111.txt',mode = 'r',encoding='utf-8') as f: # print(f.read()) # 将文件内容一次性全部读出 # print(f.readline()) # 将文件内容一行读出,如果文件内容过大,一次性全部读出可能会导致内存爆炸,逐行减轻内存压力 # print(f.readline()) # print(f.readline()) # print(f.readlines()) # 返回一个列表,列表中每个元素与文件中的行一一对应 # 也可以使用for循环将文件每行全部读出 # for line in f: # print(line) # w模式,w模式在文件存在时,会将文件清空,再进行写入,在文件不存在时会新建一个文件 # l = ['阿挺冲冲冲 ','阿挺冲冲冲 ','阿挺冲冲冲 '] # with open(r'D:pyday07 est.txt',mode='w',encoding='utf-8') as f: # print(f.readable()) # 在w模式下只能写不能读 # print(f.writable()) # f.write('asdasdasd') # 文件内容会直接清空,重新写入 # f.writelines(l) # 可以输入容器类型,内部就是for循环 # for line in l: # f.write(line) # a模式,a模式在文件不存在时会新建一个文件,在文件存在时不会清空文件,会将光标移动到末尾进行添加 # with open(r'D:pyday07 est.txt',mode='a',encoding='utf-8') as f: # print(f.readable()) # a模式下只能写,不能读 # print(f.writable()) # f.write('chongchong ') # 在文件末尾直接进行添加
''' r w a 以上三种为纯净模式 r+ w+ a+ 这三个模式均为可读可写模式,但这种模式很low,一般情况下只用纯净模式 ''' # 在r+模式下打开一个没有创建的文件,会直接报错,并不会直接创建文件 # with open(r'111.txt','r+',encoding='utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # print(f.readline()) # 文件光标移到第一行末尾 # f.write('heiheihei') # 虽然文件光标在第一行末尾,在写入的情况下,会直接在文件末尾 进行添加 # with open(r'111.txt','w+',encoding='utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # print(f.readline()) # f.write('heiheihei') # with open(r'111.txt','a+',encoding='utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # 在rt模式下read()内加的数字都是字符个数,其他模式下都是字节个数
光标在文件中的移动
''' f.seek(offset,whence) offset:相对偏移量 光标移动位数(字节数) whence: 0 参照文件的开头 t和b都可以使用 1 参照光标当前位置 只有b模式可以使用 2 参照文件的末尾 只有b模式可以使用 ''' # with open(r'111.txt','rt',encoding='utf-8') as f: # print(f.read(1)) # 读取一个字符 # f.seek(6,0) # 相对文件开头移动6个字节 # with open(r'test','rb') as f: # print(f.read()) # f.seek(-4,2) # print(f.read().decode('utf-8')) # 可以将文件中的某个字符进行替换 # with open(r'test','r+',encoding='utf-8') as f: # f.seek(3,0) # f.write('过') # 直接将字符进行替换
检测文件是否新加内容
# 检测文件是否新加内容 # with open(r'111.txt','rb') as f: # f.seek(0,2) # while True: # res = f.readline() # 查看光标移动了多少位 bytes # print(f.tell()) # if res: # print('新增内容:%s'%res.decode('utf-8')) # 说明有人在操作文件 # with open(r'111.txt','r',encoding='utf-8') as f: # f.read() # while True: # res = f.readline() # if res: # print('新增内容:%s'%res)
# 截断文件
# 截断文件 # with open(r'111.txt','a',encoding='utf-8') as f: # f.truncate(3) # 截断直接从文件头开始,截断的是字节个数
修改文件
# 修改文件 # 先将数据由硬盘读到内存(读文件) # 在内存中完成修改(字符串的替换) # 再覆盖原来的内容(写文件) # with open(r'111.txt','rt',encoding='utf-8') as f: # data = f.read() # with open(r'111.txt','w',encoding='utf-8') as f: # f.write(data.replace('nmsl','egon')) # 这种修改方式优缺点 # 优点:任意时间yp上都只有一个文件 不会过多占用硬盘空间 # 缺点:在文件内容过大时,内存可能会溢出 # 文件修改方式2 # 新建一个文件,并且将老文件中内容全部读到内存并进行修改 # 将修改好的内容写入新文件,用新文件代替老文件 直接将老文件删除,把新文件命名为老文件 import os with open(r'111.txt','r',encoding='utf-8') as f , open(r'123.txt','w',encoding='utf-8') as n: for line in f: new_line = line.replace('nmsl','egon') n.write(new_line) os.remove('111.txt') os.rename('123.txt','111.txt') # 优点:不需要考虑文件内容是否会溢出内存 # 缺点:在硬盘中会存在两个文件,占用硬盘资源