一,文件操作基本流程
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
可能出现的错误:
1.UnicodeDecodeError:文件存储和打开的方式不一样
2:路径中含有\t,\n时需要在路径之前添加r或者用\\转义
二,文件编码
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8
#这就用到了字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
三,文件的打开模式
文件句柄 = open(‘文件路径’,‘模式’)
读
E:\\new.txt 绝对路径
相对路径:同一个文件夹下的文件就是相对路径
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
rb,一般用在非文字类型的文件:图片,视频
文件的下载和上传的功能用b模式
r+,读写(先读,后写 ) r+b
f = open(‘e:\新建文本文档.txt‘,‘r+‘,encoding = ‘utf-8‘) print(f.read()) f.write(‘asdadd‘) f.close()
五种读取模式:
1、f.read() 全部读出来
f = open(‘log‘,mode=‘r‘,encoding=‘utf-8‘) content = f.read(3) # r 模式:n 是按照字符读取 print(content) f.close()
f = open(‘log‘,mode=‘rb‘) content = f.read(5) # rb 模式:n 是按照字节读取 print(content) f.close() # bytes ---> str s = b‘\xe4\xb8\xb0\xe5\x8e‘.decode(‘utf-8‘) print(s)
2、f.readline() 按行读
f = open(‘log‘,encoding=‘utf-8‘) line = f.readline() print(line) line1 = f.readline() print(line1) f.close()
3、f.readlines() 每一行作为一个元素放在列表中
f = open(‘log‘,encoding=‘utf-8‘) lines = f.readlines() print(lines) f.close()
4、 推荐方式:循环读取
f = open(‘log‘,encoding=‘utf-8‘) for i in f: print(i) f.close()
5、f.read(n)
r模式按照字符的数目读取
rb模式按照字节的数目读取
f = open(‘e:\新建文本文档.txt‘,‘r‘,encoding = ‘gbk‘) content = f.read(3) print(content) f.close()
补充:bytes-->str 一个汉字3个字节,4,5个会报错
s = b‘\xe4\xb8\xb0.decode(‘‘utf - 8‘) print(s) #丰
写
f.write(‘laozhang‘) 若果没有文件,则创建文件写内容,如果有文件则将原文件删除,再写。
f = open(‘log‘,‘w‘,encoding=‘utf-8‘) f.write(‘laozhang是sb‘) f.close() f = open(‘log1‘,‘w‘,encoding=‘utf-8‘) f.write(‘laozhang依然是sb‘) f.close()
wb模式 需要将写入的字符串.encode转换成二进制,并添加编码
写读w+ 先写后读,f.seek(0)光标移动到开头
f = open(‘log1‘,‘wb‘) f.write(‘laozhang依然是sb‘.encode(‘utf-8‘)) f.close()
追加
只追加 a ab
f = open(‘e:\新建文本文档.txt‘,‘a‘,encoding = ‘gbk‘) f.write(‘3‘) f.close()
断点续传用到了tell和seek,都是按照字节去调整光标位置。
.truncate截取,按照字节去截取。
with open(‘log‘,‘r‘,encoding = ‘utf-8‘) as f1:
print(f1.read())
方法汇总:
def close(self, *args, **kwargs): # real signature unknown 关闭文件 pass def fileno(self, *args, **kwargs): # real signature unknown 文件描述符 pass def flush(self, *args, **kwargs): # real signature unknown 刷新文件内部缓冲区 pass def isatty(self, *args, **kwargs): # real signature unknown 判断文件是否是同意tty设备 pass def read(self, *args, **kwargs): # real signature unknown 读取指定字节数据 pass def readable(self, *args, **kwargs): # real signature unknown 是否可读 pass def readline(self, *args, **kwargs): # real signature unknown 仅读取一行数据 pass def seek(self, *args, **kwargs): # real signature unknown 指定文件中指针位置 pass def seekable(self, *args, **kwargs): # real signature unknown 指针是否可操作 pass def tell(self, *args, **kwargs): # real signature unknown 获取指针位置 pass def truncate(self, *args, **kwargs): # real signature unknown 截断数据,仅保留指定之前数据 pass def writable(self, *args, **kwargs): # real signature unknown 是否可写 pass def write(self, *args, **kwargs): # real signature unknown 写内容 pass
常用方法:
read readable readline readlines for循环
seek tell write writeable
改动文件:
# 1,创建一个新文件. # 2,读取原文件. import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,‘w‘,encoding=‘utf-8‘) as f2: # 3,将原文件的内容通过你想要的方式进行更改,并写入新文件件. old_content = f1.read() new_content = old_content.replace(‘alex‘,‘SB‘) f2.write(new_content) #4,将原文件删除. os.remove(‘log‘) #5,将新文件重命名原文件名. os.rename(‘log.bak‘,‘log‘)