我们来说一下python对文件的操作
1、文件读写3种模块的区别
打开文件的模式有:
1
2
3
|
r,只读模式(默认)
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】
|
"+" 表示可以同时读写某个文件
1
2
3
|
r+,【可读、可写;可追加,如果打开的文件不存在的话,会报错】
w+,【写读模式,使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】
a+,【追加读写模式,不存在则创建;存在则只追加内容;】
|
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
1
2
|
rU
r+U
|
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
1
2
3
|
rb
wb
ab
|
举个例子:
# r r+ r+读是没问题,写的话,会覆盖原来得内容,文件不存在会报错 # w w+ w+写文件没问题,覆盖了以前的,读不行 # a a+ a+读写都没得问题,文件不存在会创建 # rb rb+ wb wb+ ab ab+ bytes(二进制) 读图片等 f = open('users', 'r+', encoding='utf-8') f.write('******') print(f.read()) f.close() f = open('users', 'a+', encoding='utf-8') f.seek(0) f.truncate() # 清空文件 # f.write('******') # print(f.read()) f.close()
2、with使用:
在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件。
1
2
3
4
5
6
7
|
with open('file.txt','r') as f:#打开一个文件,把这个文件的句柄付给f
for line in f:
print(line)
with open('file.txt') as fr,with open('file_bak','w') as fw: #这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件
for line in fr:#循环file.txt中的每一行
fw.write(line)#写到file_bak文件中
|
3、大文件时,读取文件高效的操作方法:
- 用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据多,非常卡。
- 高效的操作,就是读 一 行操作一行,读过的内容就从内存中释放了
1
2
3
4
|
f = open('file.txt')
for line in f:
print(line)
这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存
|
4、修改文件,有两种方式:
- 第一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;
- 第二种是把修改后的文件内容写到一个新的文件中
# 1、简单粗暴直接的(修改小文件用这种方式) # (1)读取文件所有内容 # (2)replace # (3)清空文件 # (4)把新的内容写进去 with open('数据', 'r+', encoding='utf-8') as f: # with自动管理上下文(用with不需要关文件) content = f.read() new_content = content.replace('100', '100000') f.seek(0) f.truncate() f.write(new_content) f.flush() #(内容没更新时用)不管你的缓冲区有没有满,立马更新到磁盘上 # 2、两个文件操作(文件大的时候用) # (1)r模式打开a文件,w模式打开b文件 # (2)逐行读取a文件的内容,读完之后替换内容 # (3)把替换完的内容写到b文件里面 # (4)把a文件删掉,把b文件的名字改成a文件 import os # 导入os with open('数据', encoding='utf-8') as f1, open('数据2', 'w', encoding='utf-8') as f2: for line in f1: new_line = line.replace('4', '44444') f2.write(new_line) os.remove('数据') #删除 os.rename('数据2', '数据') #改名 # 写在with外面
一朵黑莲花