文件:
文件是操作系统提供给应用软件操作硬盘的一个虚拟单位,用于应用软件将数据永久保存
文件处理基础知识:
1. 应用软件通过系统软件去控制硬件
2.打开文件:f = open('文件路径',mode='打开方式',encoding='操作文件的字符编码')
f = open('')相当于创建一个python变量,在程序结束时,变量被回收,但是此时操作系统仍然打开着文件,意味着每open(‘’)一次,实际上占用了两个内存资源:1.python在应用软件空间内为变量所指对象创建的命名空间(与放程序的空间不同),2:操作系统打开文件时所获得的文件编号(操作系统能打开的文件数量有限,如果达到上限,就无法再打开文件,这让我想起了磁盘满的两种情况:1.innode号好满,2.数据block满)
3.读/写
4.关闭:f.close() ---应用软件给操作系统发送请求,使操作系统关闭文件,回收系统文件资源
文件上下文管理器:
with open('') as f:
1.可自动执行关闭操作(无需f.close())
2.可连续打开多个文件(with open('') as f,open('') as f1:)
对于循环按行读取文件内容:
1.with open('') as f: 2.with open('') as f:
for line in f: for line in f.readlines():
print(line,end='') print(line,end='')
------->使用文件自身的迭代器 ----->将文件一次性读到列表内,但是文件内容过大时,内存会崩溃
文件操作:
f = open(‘’),默认是以r t方式打开(只读文本方式),默认打开文件的编码是当前操作系统的默认字符编码(中国版的win为gbk,linux,mac为utf-8)
操作文件的三种方式:r:只读方式,w:只写覆盖方式,a:只写追加方式
r模式下:
1. f.read(N):如果不指定N:从光标处读取整个文件,指定N:读取N个字符(不要忘记\n),可配合seek()读取指定字符。(只有在rt模式下的read(N)单位是字符,除此之外文件内的指针移动都是以字节为单位的)
2. f.readable(N): ---查看文件是否可读
3.f.readline():从光标处开始,读取一行
4.readlines():从光标处开始,读取整个文件到字符串列表
5.f.write() ---在文件光标处,写入字符串 6.f.writelines() ---把列表内的字符串写入文件
注意:f.seek(offset,whence):
offset代表偏移量.即偏移字节数.使用偏移量的时候注意字符编码,gbk一个中文字符由两个字节表示,utf-8通常由3个字节表示,如果偏移半个字符就会造成错误
f =open('test.txt',encoding='utf-8') f.seek(2) print(f.read()) f.close() -------> File "C:\Python\Python36-32\lib\codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8a in position 0: invalid start byte
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起,
1代表从当前位置开始算起,
2代表从文件末尾算起
1,2只能在b模式下使用
#你hello好 文件内容 with open('a.txt','r',encoding='utf-8') as f: msg1=f.read(1) print(f.tell()) f.seek(3,0) msg2=f.read(1) print(msg1,msg2) --->执行 3 ---说明在rt模式下read()是以字符为单位的 你 h ---说明seek()是以字节为单位的 如果seek()使用1/2模式皆会报错,只能在b模式使用! with open('a.txt','rb') as f: msg1=f.read(3) print(f.tell()) f.seek(3,1) msg2=f.read(1) print(msg1, msg2) print(msg.decode('utf-8'),msg2.decode('utf-8')) --->执行 3 ---说明在b模式下read()是以字节为单位的 b'\xe4\xbd\xa0' b'l' 你 l with open('a.txt','rb') as f: f.seek(-3,2) msg = f.read(3) print(msg.decode('utf-8')) --->读取最后一个字符
truncate(N):截断文件,删除指定字节数后的全部内容...