在使用python编程时,经常会遇到读写文件的操作。很多童鞋困扰于读写文件的各种模式(如阅读、写入、追加等),以及搞不清open、read、readline、readlines、write等方法的使用。文件读写是python基本操作,本文从实例简要学习,并呈现其代码实现差异性。
1、文件的打开与关闭:open函数和close函数
1.1 open函数
如果你想用python读取文件(如txt、csv等),第一步要用open函数打开文件。open()是python的内置函数,它会返回一个文件对象,这个文件对象拥有read、readline、write、close等方法。open函数有两个参数:
fo = open(‘file’,‘mode’)
参数解释 file:需要打开的文件路径 mode(可选):打开文件的模式,如只读、追加、写入等
mode常用的模式: r:表示文件只能读取 w:表示文件只能写入 a:表示打开文件,在原有内容的基础上追加内容,在末尾写入 w+:表示可以对文件进行读写双重操作
当你需要以字节(二进制)形式读写文件时,只需要在mode参数中追加’b’即可: rb:以二进制格式打开一个文件,用于只读 wb:以二进制格式打开一个文件,用于只写 ab:以二进制格式打开一个文件,用于追加 wb+:以二进制格式打开一个文件,用于读写
当你在默认模式下读取文本文件时(二进制文件不可以),文件中的换行符会转换为’\n’形式。
1.2 close函数
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。 如下实例:
fo = open("foo.txt", "w")
print("文件名: ", fo.name)
fo.close()
1.3 with语句
在打开文件时,很多人通常直接用open(‘file’),这样并不酷。最好使用 with 关键字。优点是当子句体结束后文件会正确关闭,即使在某个时刻引发了异常。 例子:
with open('workfile') as f:
read_data = f.read()
f.closed
这是出于异常处理的一种文件打开方式。(是不是显得逼格更高呢?haha)
2、FILE对象
一个文件被打开后,你有一个file对象fo,你可以得到有关该文件的各种信息。以下是和file对象相关的所有属性的列表:
属性 | 描述 |
---|
file.close | 关闭文件,若关闭返回True | file.mode | 返回文件的打开模式 | file.name | 返回文件的名称 |
如下实例:
fo = open("foo.txt", "w")
print("文件名: ", fo.name)
print("是否已关闭 : ", fo.closed)
print("访问模式 : ", fo.mode)
实例输出结果如下:
文件名: foo.txt
是否已关闭 : False
访问模式 : w
3、文件对象的三种读取方式:read()、readline()和readlines()
下面以一个csv文件的读取为例进行说明。csv内容如下:
Frog | | | |
---|
Frog | Dog | Shadow | Diversion | 1m | 3m | 2m | 1m | 2m | 4m | 2m | 5m | 4m | 7m | 6m | 6m | 9m | 8m | 6m | 8m | 1p | 1p | 3p | 8m |
3.1 read()函数
当使用open函数打开文件后,就可以使用该文件对象的各种方法了,read就是其中一种。read()会读取一些数据并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)返回。
read()有一个参数:
fo.read(size)
读取上述csv文件的前66个字节如下:
fo = open("f:\\test.csv","r")
content = fo.read(66)
print(content)
fo.close()
输出结果为:
Frog,,,
Frog,Dog,Shadow,Diversion
1m,3m,2m,1m
2m,4m,2m,5m
4m,7m,6m
注意,这里的字节包含每一行行末的换行符\n。空格不占字节位置。
3.2 readline()函数
readline方法从文件中读取整行,包括换行符’\n’。换行符(\n)留在字符串的末尾,如果文件不以换行符结尾,则在文件的最后一行省略,这使得返回值明确无误。如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾,而空行使用 ‘\n’ 表示,该字符串只包含一个换行符。 f.readline()有一个参数:f.readline(size),其中参数size表示从文件读取的字节数。 仍以上述csv文件为例。
with open('f:\\test.csv') as f:
print(f.readline())
print(f.readline(13))
f.close()
输出结果为:
Frog,,,
Frog,Dog,Shad
可以看出,readline方法会记住上一个readline函数读取的位置,接着读取下一行。所以当你需要遍历文件每一行的时候,不妨使用readline方法吧!
3.3 readlines()函数
readlines方法和readline方法长得像,但功能不一样,前面说过readline方法只读取一行,readlines方法则是读取所有行,返回的是所有行组成的列表。readlines方法没有参数,使用更加简单。
with open('f:\\test.csv') as f:
print(f.readlines())
f.close()
输出结果为:
['Frog,,,\n', 'Frog,Dog,Shadow,Diversion\n', '1m,3m,2m,1m\n', '2m,4m,2m,5m\n', '4m,7m,6m,6m\n', '9m,8m,6m,8m\n', '1p,1p,3p,8m\n']
显示了csv文件中每一行的换行符,每一行为一个字符串。更进一步进行行处理,实例如下:
with open('f:\\test.csv') as fo:
for line in fo.readlines():
line = line.strip()
data = line.split(',')
print("data",data)
得到各行处理的结果:
data ['Frog', '', '', '']
data ['Frog', 'Dog', 'Shadow', 'Diversion']
data ['1m', '3m', '2m', '1m']
data ['2m', '4m', '2m', '5m']
data ['4m', '7m', '6m', '6m']
data ['9m', '8m', '6m', '8m']
data ['1p', '1p', '3p', '8m']
4、文件对象的写操作:write()
write方法顾名思义,就是将字符串写入到文件里。
with open('sample.txt','w') as fw:
fw.write('hello,my friends!\nthis is python big data analysis')
fw.close()
|