Python基础 ( 五 ) —— 文件处理
#文件处理
注:
#windows下的换行为\r\n ,linux下为\n
#windows默认系统编码方式为gbk(ANSI) ,mac为utf8 。故在windows下得指定编码方式
#windows下打开记事本另存为时可以查看编码方式
#当不知道文件编码方式时,open函数 encoding = ' latin-1 ' 可以识别大多数编码方式(不包括中文)
#pycharm 在windows下默认显示的时候把\r\n 改成\n ,但实际上还是\r\n,故在使用tell()函数时的计数要小心
所以使用newline参数可以解决这个问题:
在Python 3,可以通过open函数的newline参数来控制Universal new line mode:
读取时候,不指定newline,则默认开启Universal new line mode,所有\n, \r, or \r\n被默认转换为\n ;
写入时,不指定newline,则换行符为各系统默认的换行符(\n, \r, or \r\n, ),
指定为newline='\n',则都替换为\n(相当于Universal new line mode);
不论读或者写时,newline=''都表示不转换
f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')
f.write('1111\r\n2222\r\n3333\r\n')
print(f.tell())
f.seek(0,0) #指针(光标)回到开头,下文有详细用法
print(f.readlines())
f.close()
#for循环文本(文件句柄)为一行一行读取
with open('text111','rb') as f :
for i in f : -->无需f.readlines()-->一次读取所有行,占用内存大
print(i)
#获取最后一行的一种思路
with open('text111','rb') as f : num = -10 while True : f.seek(num,2) data = f.readlines() if len(data) > 1 : print(data[-1].decode('utf-8')) break num *= 2
#文件打开模式
r 只读
w 只写
a 只追加
x 只读,没文件会报错
#open中的mode参数
'r' 'w' 'a' 'x'
#以下注意!!!
'w+' == w + r #假定open的文件存在的情况下:以w的形式open 并加上r功能 (打开一个空文件,执行操作后覆盖回原文件)
f = open('text1','w+',encoding='utf-8') --> f称为文件句柄 data = f.readlines() --> data 的值为空 ,因为w+ 是开一个空文件,无论之前该文件里有何内容都无关 print(data) f.write('\n11\n22\n33\n44\n') --> 写入文本 data1 = f.readlines() print(data1) --> data1 的值仍然为空,因为读取是从写入的文本的最后开始读取 f.close()
'a+' == a + r #假定open的文件存在的情况下:以 a 的形式open 并加上r功能(打开原文件,从文件的末尾开始执行操作)
f = open('text1','a+',encoding='utf-8') data = f.readlines() --> data 的值为空 ,因为a+ 是打开原文件,但是从末尾开始执行操作,此时末尾无字符,读取的为空 print(data) f.write('\n11\n22\n33\n44\n') --> 追加文本 data1 = f.readlines() print(data1) --> data1 的值仍然为空,因为读取是从追加的文本的最后开始读取(为空) f.close()
'r+' == r + w #假定open的文件存在的情况下:以 r 的形式open 并加上w功能(打开原文件,从文件的开头开始执行操作)
f = open('text1','r+',encoding='utf-8') data = f.readlines() --> data 的值为原文件里的文本 ,因为a+ 是打开原文件,从开头开始执行操作 print(data) f.write('\n11\n22\n33\n44\n') --> 读取完文件后,光标到达文件末尾,从末尾写入文本 data1 = f.readlines() print(data1) --> data1 的值仍然为空,因为是从写入文本的最后开始读取(为空) f.close()
'x+' == x + r
#文件处理t模式(默认)
#文件处理读操作
#open函数(open的值称为文件句柄)
f = open('C:\\Users\\ssy\\Desktop\\1.txt', 'r' ,encoding='utf-8') #注意路径分隔符为\\ ,不指定路径只输入文件名(1.txt)则需要文件与py代码文件的路径一致 #open函数如果不指定编码方式,默认使用当前系统的编码读取文本
#第二个参数 'w' 代表 只写模式(不可读),不输入默认为 r 只读模式 text = f.read() print(text) f.close()
#read函数
f = open('C:\\Users\\ssy\\Desktop\\1.txt',encoding='utf-8') a = f.readable() -->判断是否可读 b = f.readline() -->一次读取一行,第一行开始(下一行有文本的情况下,读取完默认换行(实际上顺序读取每一行的每个字符,包括隐藏的\n)) c = f.readline()
d = f.readlines() -->从当前光标位置开始(如上面调用了readline函数,从调用后的光标位置开始),读取所有行,存入列表中 print(a) print(b , end='')
print(d) f.close()
#文件处理写操作(默认的写入编码为open里指定的编码方式)
#write函数
f = open('C:\\Users\\ssy\\Desktop\\1.txt','w',encoding='utf-8') # w (只写) 模式下,直接开一个新文件覆盖原文件(相当于清空了原文件),再开始下一步操作. #若没有此文件,则会创建 f.write('111111 the first line\n') f.write('end 0,0\n Aha ! you were tricked !\n') f.writable() #判断是否 只写 模式 f.writelines(['aaa\n','123','bbb',['abc']]) #注意文件里都为字符串类型,故也只能写入字符串 f.close()
#文件处理追加操作
f = open('C:\\Users\\ssy\\Desktop\\1.txt','a',encoding='utf-8') f.write('write in the end \n') f.close()
#文件处理with语句(打开文件执行完操作后自动关闭文件)
with open('text1','w',encoding='utf-8') as f : f.write('hello world~\n')
#同时打开多个文件进行操作
with open('text1','w',encoding='utf-8') as f , open('text2','w',encoding='utf-8') as f1 : #此操作 open文件有先后顺序(左到右) f.write('hello world~\n') f1.write('I hate the world !!!\n')
#文件处理b模式(上文的其实都省略了一个默认的t ,即 r 为 rt ,w 为wt ,以文本模式处理)
#优点:
#跨平台通用(不同操作系统)
#可以处理非文本文件,如视频、图片之类(上文的t模式就不行)
#Linux 默认以b模式处理
#rb wb ab rb+ wb+ ab+ 以字节的形式的方式处理文件 --> i.e. 把字符串分割成一个一个字节输出
#写入文本的过程 : 字符串 --> encode --> bytes --> bit
#读取文本的过程(open): bit --> bytes --> decode -->字符串
#rb 模式
f = open('C:\\Users\\ssy\\Desktop\\1.txt','rb') data = f.read() #读取的是bytes data1 = data.decode(encoding='utf8') #将bytes用指定编码方式解码 print(data) print(data1) f.close()
#wb 模式
#写入的不能是字符串,而是要编码成bytes
f = open('C:\\Users\\ssy\\Desktop\\1.txt','wb') a = '这是我要输入的内容\r\n' #windows下的换行\r\n f.write(a.encode('utf8')) #两种编码函数 f.write(bytes(a,encoding='utf8')) f.close()
#ab 模式(同理)
f = open('C:\\Users\\ssy\\Desktop\\1.txt','ab') a = '这是我要输入的内容\r\n' f.write(a.encode('utf8')) f.write(bytes(a,encoding='utf8')) f.close()
#文件操作的其他方法
f = open('text','w',encoding = 'utf8')
f.closed #判断文件是否关闭
f.encoding #输出open使用(i.e.文件打开的编码方式)的编码方式(不同平台有不同的名字,如cp936就是GBK)
f.flush() #刷新 , 将写入的内容写入磁盘中(保存),否则默认是文件关闭的时候保存
f.name #返回文件的绝对路径(包括文件名)
f.tell() # 返回当前光标所在的位置(一个字节一位,故别忘了\n 或者\r\n)
#控制文件内指针(光标)的移动
#文件内指针移动,只有在read()下光标以字符移动
#除此以外文件内指针的移动都是以字节为单位
#read()函数
read(n) #从当前光标处读取n个字符
#seek()函数 (指针(光标)的移动) !!!!!!
如果f.seek(n)只有一个参数( 默认以0为参考位置),代表跳到第n个光标位置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!超级实用
f.seek(offset,whence)如果有两个参数:
offset代表控制指针移动的字节数
whence:代表参照什么位置进行移动
whence=0: 参照文件开头 -->需要b模式
whence=1: 参照当前所在的位置 -->需要b模式
whence=2: 参照文件末尾 -->需要b模式
with open('text111','rb') as f : f.seek(-5,2) -->倒着移动指针 print(f.read(1))
#因为seek是以字节为单位来移动,如果不是b模式,移动到中文(如GBK 占两个字节)的字节位置会出错
f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')
f.write('1111\r\n2222\r\n3333\r\n')
f.seek(0,0)
f.write('你')
f.seek(0,0)
print(f.read())
f.close()
#文本截取truncate()
#Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。
#指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
#注意是从头开始截断,不依赖于指针位置
f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')
f.write('1111\r\n2222\r\n3333\r\n')
f.seek(6)
print(f.tell())
print(f.read(4))
f.truncate(4)
f.close()

浙公网安备 33010602011771号