python基础之文件操作

本文主要讨论python中文件的操作。

1.文件的基本操作:

1 f=open('文本处理.txt',encoding='utf-8')
2 data=f.read()
3 print(data)
4 f.close()

对于一个文件,使用open函数打开该文件,使用close()函数关闭该文件。注意,open一个文件,必须要使用close关闭,否则该文件会一直占用内存

2.指定模式打开文件(r,w,a)

(1)r模式:只读模式

1 f=open('文本处理.txt','r',encoding='utf-8') #如果不指定打开方式,默认以r模式打开
2 data=f.read()
3 print(data)
4 f.close()

r模式表示以只读模式打开文件,这样就可以读取文件内容,但是也只能读取文件的内容,不能修改文件内容。可以通过readable函数判断一个文件是否可读:

1 f=open('文本处理.txt','r',encoding='utf-8') #如果不指定打开方式,默认以r模式打开
2 print(f.readable()) #若文件可读,返回true,否则返回false
3 f.close()

在r模式下,有三种方式读取文件的内容:read(),readline(),readlines().

a.read()函数,一次读取文件的全部内容,光标移动至文件末尾,即(1)中的代码形式

b.readline()函数,一次读取文件的一行,可以使用for循环遍历分行读取文件内容:

1 f=open('文本处理.txt','r',encoding='utf-8')
2 for i in f:
3     print(f.readline()) #因为windoow中文件的每一行是以
结尾的,因此这样会导致每一行之间多出一行空行
4 
5 for i in f:
6     print(f.readline(),end='')#在print语句中加入end可以去掉每一行之间的空行

c.readlines()按行读取文件内容:

1 f=open('文本处理.txt','r',encoding='utf-8')
2 data=f.readlines() #按行读取文件所有内容,并将文件内容以列表的形式返回,列表的每一个元素就是文件的每一行的内容(包含
字符)
3 print(data)
4 f.close()

 (2)w模式:只写模式(每一次都会覆盖掉文件的内容)

  w模式表示只写,即只能向文件中添加内容,不能读取文件中的内容。可以通过writables函数来查看一个文件是否是可写的

1 f=open('wr.txt','w',encoding='utf-8')
2 print(f.writable()) #若文件可写返回true,否则返回false

  向文件中写入数据有两种方式:write()和writelines()

a.write():一次将所有内容写入文件中,可以通过 来换行:

1 f=open('wr.txt','w',encoding='utf-8')
2 print(f.writable()) #若文件可写返回true,否则返回false
3 f.write('122323233333
222222222
44445455454')
4 f.close()

b.writelines()

1 f=open('wr1.txt','w',encoding='utf-8')
2 print(f.writelines(['123
','455
','dgue'])) #序列中的元素必须是字符串,只能写入字符串。print的输出结果是None,
3 #                                             #如果是write()函数,print的输出结果是写入文件的内容
4 f.close()

(3)a模式:追加模式

  a模式也是向文件中写入数据,不过不同于w模式,w模式是每一次写入新的内容都会覆盖掉文件的内容,而a模式是在文件结尾添加内容,不会覆盖掉文件之前的内容。

1 f=open('wr1.txt','a',encoding='utf-8')
2 f.write('写道最后一行')
3 f.writelines(['hheh','344343'])
4 f.close()

  a模式下向文件中写入数据的方法与w模式一致。

3.文件编码

1 f=open('wr1.txt','r+',encoding='gbk') #w1.txt是以utf-8写入的,因此必须要以utf-8的编码读,否则会出现乱码
2 data=f.read()
3 print(data)

需要注意,读取文件一定要保持编码方式一致,用什么编码写入的文件,就一定要以什么编码读取文件,否则会出现乱码。可以通过encoding函数来查看文件的编码:

1 f=open('wr.txt','r+')
2 print(f.encoding)
3 f.close()

4.r+,w+,a+

r,w,a都只是单一的只读只写操作,如果想要既能读又能写,那就需要用到r+,w+,a+三种操作了,r+表示既可以读文件,也可以写入文件,写入文件是在文件末尾添加,这种模式不会覆盖掉文件之前的内容。但是需要注意,这种模式下,如果文件不存在,是不会新创建一个文件的,而a+模式则会新建一个文件。w+,a+都是既可以向文件中写入数据,也可以读取文件的数据,两者区别是,在w+模式下,一旦运行程序,就会自动清空文件之前的所有内容,而a+则不会

1 f=open('wr1.txt','w+',encoding='utf-8')  #w+模式下,一运行程序,就会自动把文件内容清空
2 data=f.read()  #读取不到数据,因为w+已经把文件数据清空
3 print(data)
4 f.close()

5.with关键字

  若直接使用open函数,那么在每一次使用open函数时候都必须要使用close函数来关闭文件,如果不想这样做,可以使用with关键字:

1 with open('wr1.txt','r',encoding='utf-8') as f:
2     data=f.read()
3     print(data)

6.使用with关键字把一个文件内容写入另一个文件中:

1 with open('wr1.txt','a',encoding='utf-8') as f1,
2         open('wr.txt','r',encoding='utf-8') as f2:  #f1以只写模式打开,f2以只读模式打开,这样就可以把f2的内容写入f1中
3     data=f2.read()
4     f1.write(data)
5     print(data)

7 rb,ab,wb二进制模式读取文件

1 #f=open('wr.txt','rb',encoding='utf-8')  #错误,b模式不能指定encoding
2 f=open('wr.txt','rb')
3 data=f.read() 
4 print(data)

注意,二进制模式操作文件不能指定编码方式,因为文件编码就是为了把字符串编码为二进制,如果已经是用二进制进行操作文件,自然不需要再编码

1 #f=open('wr.txt','rb',encoding='utf-8')  #错误,b模式不能指定encoding
2 f=open('wr.txt','ab')
3 #data=f.write('dederfrefr') #错误,在b模式下,必须以二进制的方式向文件写入数据,因此必须把字符串转为二进制
4 f.write(bytes('hello',encoding='utf-8')) #可以使用bytes函数指定编码方式将字符串转为二进制
5 f.write('nihaoya'.encode('utf-8'))       #也可以使用encode函数指定编码方式

以二进制模式向文件写入数据时,需要将字符串转为二进制的方式,不能直接写入字符串

8 wt和rt

  wt和rt是针对windows平台的文本格式处理,主要是处理换行符的,在wt模式下,Python写文件时会用 来表示换行,在rt模式下,python在读取文本时会自动把 转换成

9文件处理的其他方法

(1)closed 判断文件是否关闭,如果关闭,则返回true,否则返回false

1 f=open('wr.txt','r+',encoding='utf-8' ,newline='')  #读取文件中真正的换行符
2 data=f.readlines()
3 print(data)
4 print(f.closed)  #判读文件是否关闭,如果关闭则返回true,否则返回false
5 f.close()
6 print(f.closed)

(2)flush()将内存中的数据刷到硬盘上

1 f=open('wr.txt','a+',encoding='utf-8')
2 f.write('heheh')
3 f.flush()  #将内存中的数据刷到硬盘上
4 f.close()

(3)tell()返回光标当前的位置

1 f=open('wr.txt','r+',encoding='utf-8')
2 print(f.tell())  #返回光标当前的位置
3 data=f.readline()
4 print(f.tell())
5 print(data)
6 f.close()

(4)seek()将光标移动指定的字节

1 f=open('wr.txt','rb')
2 print(f.tell())
3 f.seek(3)           #将光标从当前位置向后移动三个字节
4 print(f.tell())
5 f.seek(3,1)         #将光标从当前位置向后移动三个字节
6 print(f.tell())
7 f.seek(-5,2)        #将光标从文件末尾向前移动五个字节
8 print(f.tell())
9 f.close()

  seek(n,flag=1)seek函数有两个参数,第一个参数是光标移动的字节数,第一个参数是缺省参数,表示是从前向后移动光标还是从文件结尾向前移动光标,其中1代表从前向后移动。2等于从结尾向前移动,注意,如果flag=2,则n要使用负数

(5)truncate(n)保留文件前n个字节

1 f=open('wr1.txt','ab+')
2 f.truncate(10)          #从头开始算,只保留文件0-10个字节
3 f.close()

10利用seek函数查看大文件的最后一行(一般日志文件需要)

 1 f=open('wr.txt','rb')
 2 offs=-3
 3 while True:
 4     f.seek(offs,2)
 5     data=f.readlines()
 6     if len(data)>1:
 7         print('最后一行:',data[-1])
 8         break
 9     offs=offs*2
10 f.close()
原文地址:https://www.cnblogs.com/jiachuantang/p/8387689.html