Python Day 8
文件操作
必要的条件
1:操作的文件 file
2:编码 encoding=''
3:模式 mode=''
文件操作的流程:
1.打开文件,产生文件句柄。
2.对文件句柄进行相应的操作。
3.关闭文件。
#凡是带b不用encoding (bytes默认utf-8编码格式)
#只有是r模式 mode='r'可以省略不写
基本操作方法:
f = open('文件名',encoding='编码',mode='r') #变量:f1_obj,f1_file,file,file_handle... 文件句柄。open Python的内置函数,但是底层调用的windows系统的open功能,open功能就是操作文件用的。windows系统默认的编码方式gbk,linux,macos:utf-8.
print(f.read()) #不能缩进
f.close()
简化操作方法:
with open('aaa.txt',encoding='utf-8',mode='r') as f1: #不用主动关闭 f1.close() print(f.read()) pass f1.close() #嵌套操作打开多个文件可以主动关闭 with open('bbb.txt',encoding='utf-8',mode='w') as f2: f2.write('hello')
with open('log1', encoding='utf-8') as f1, open('log2',encoding='utf-8', mode='w') as f2: print(f1.read()) f2.write('666')
文件操作模式:
读 r
r模式:read(n) n 是按照字符读取。
rb模式:read(n) n 是按照字节读取。
1、r 只读 (5种读取方法)
1、for循环 最好的 (文件句柄是一个可迭代对象,使用for循环读取时每次只占用一次内存,适用于读取大文件)
2、f.read() (一次性全部读出来,加载到内存当中。缺点受限于内存,大文件读取会受影响)
3、f.read(n) (按字符读取。缺点不方便)
4、f.readline() (按行读取,一次读取一行。缺点多行时,需要重复很多次。)
5、f.readlines() (一次读取全部,形成列表,一行是一个元素。缺点受限于内存,大文件读取受影响)
2、rb 只读b模式(读取非文字类文件(图片,视频,音频))
3、r+ 读写,先读后写
4、r+b 读写b模式,b模式的先读后写
=============================================================
写 w (没有文件,创建文件写内容。如果有文件,清空原文件,写入新内容。)
1、w 只写
2、wb 只写b模式
3、w+ 写读,先写后读
4、w+b 写读b模式,b模式的先写后读
=============================================================
x, 只写模式【不可读;不存在则创建,存在则报错】
=============================================================
追加 a (没有文件,创建文件写内容。如果有文件,在文件原内容最后,追加写入新内容。)
1、a 只追加
2、ab 追加b模式
3、a+ 追加可读
4、a+b 追加可读b模式
补充: gbk utf-8
对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
s1 = '123abc*'
b1 = s1.encode('utf-8')
s2 = b1.decode('gbk')
print(s2)
文件操作常用方法
read() :读取
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8') 2 print(f1.read()) 3 f1.close() 4 5 with open('aaa.txt',encoding='utf-8') as f2: 6 print(f2.read())
write() :写入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='w') 2 f1.write('老男孩') 3 f1.close() 4 5 with open('aaa.txt',encoding='utf-8',mode='w') as f2: 6 f2.write('小男孩')
read(n) :一次读取多个字符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='r') 2 print(f1.read(3)) 3 f1.close() 4 5 with open('aaa.txt',encoding='utf-8',mode='r') as f2: 6 print(f2.read(3))
readline() :一次读一行,多行需要读取多次
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='r') 2 print(f1.readline()) 3 print(f1.readline()) 4 f1.close() 5 6 with open('aaa.txt',encoding='utf-8',mode='r') as f2: 7 print(f2.readline()) 8 print(f2.readline())
readlines() :一次性读取全部,生成列表,每一行是列表的一个元素。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f1 = open('aaa.txt',encoding='utf-8',mode='r') print(f1.readlines()) f1.close() with open('aaa.txt',encoding='utf-8',mode='r') as f2: print(f2.readlines()) ================ ['小男孩 ', 'ok ', '123 ', 'aaa'] ['小男孩 ', 'ok ', '123 ', 'aaa']
seek(0) :移动光标,按照字节去调整光标 seek(0,2) 光标调整到最后
tell() :告诉光标位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='a') 2 print(f1.tell()) #0 初始光标位置,追加从末尾开始 3 print(f1.write('中')) #4 返回写入字符个数 4 print(f1.tell()) #4 当前光标位置 5 f1.seek(0) #移动光标 到0字节处 6 print(f1.tell()) #0 7 f1.close()
readlable() :判读是否可读
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='a') 2 print(f1.readable()) 3 f1.close() 4 5 返回bool
writable() :判断是否可写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f1 = open('aaa.txt',encoding='utf-8',mode='w') 2 print(f1.writable()) 3 f1.close()
truncate(3) :对原文件进行截取内容,以字节形式截取保留,只能再a模式下使用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f1 = open('aaa.txt',encoding='utf-8',mode='a') f1.truncate(3) f1.close() aaa.txt aaa123bbb =============== aaa
文件的改
改的流程
1,打开原文件 old_file,将原内容读取到内存。
2,创建一个新文件new_file。
3,将原内容通过你修改,形成新内容,写入到新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
方法一: read读取,一次性修改。
import os with open('aaa.txt',encoding='utf-8') as f1 , #打开原文件 open('.swap.aaa.txt',encoding='utf-8',mode='w') as f2: #创建新文件 a = f1.read().replace('aaa','bbb') #一次性读取,修改原文件内容 f2.write(a) #将修改后的全部内容,写入新文件。 os.remove('aaa.txt') #删除原文件 os.rename('.swap.aaa.txt','aaa.txt') #将新文件重命名为原文件名。
方法二: for循环读取按行修改。
import os with open('aaa.txt',encoding='utf-8') as f1, #打开原文件 open('.aaa.txt',encoding='utf-8',mode='w') as f2: #打开一个新文件 for line in f1: #按行读取原文件 line = line.replace('aaa','bbb') #替换每一行的文件内容 f2.write(line) #每行写入一次 os.remove('aaa.txt') #文件写入完成后删除原文件 os.rename('.aaa.txt','aaa.txt') #新文件重命名为原文件名