东尧爱分享
这是东尧每天一篇文章的第22天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
我们电脑上有很多的文件,包括txt等等,那python如何读取这些文件,又如何写文件呢?实际上Python中是使用open函数来进行文件的访问。今天的教程就教大家python文件的读写相关操作。
读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘。
所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
1
文件操作函数
打开和创建文件对象函数open()
file_object = open(file_name, access_mode='r', buffering=-1)
参数说明:
file_object变量名,用于标识这个文件对象
file_name你要打开的文件名(字符串),它可以是相对路径也可以是绝对路径
access_mode文件的打开方式,默认是以只读的方式打开
buffering访问文件的缓冲方式。0表示不缓冲,1表示只缓冲1行数据,任何其它大于1的值代表使用给定值作为缓冲区大小。不提供该参数或者给定负值代表使用系统默认缓冲机制,一般情况下采用系统默认的就好。
路径说明:
相对路径:如果文件与python代码文件在同一个文件夹内(当前文件夹),就不用写路径,直接写文件名就好了。
绝对路径:对文件进行右键单击,在属性里面就可以查看到文件的绝对路径了。使用open函数时将绝对路径填写进去即可。例如:hello = open('D:\learning\python\learning\hello.txt','r+')
文件打开方式说明:
模式
说明
r
以只读方式打开
rU或U
以读方式打开,同时提供通用换行符支持
w
以写方式打开,如果文件已经存在,会覆盖掉原来的数据
a
以追加模式打开,在文件后面追加数据,不能读
r+
以读写模式打开
w+
以读写模式打开,参见w
a+
以读写追加模式打开,参见a
rb
以二进制读模式打开
wb
以二进制写模式打开
ab
以二进制追加模式打开
rb+
以二进制读写模式打开
wb+
以二进制读写模式打开
ab+
以二进制读写追加模式打开
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
>>> f=open('/Users/michael/notfound.txt', 'r')
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
文件打开实例:
本地文件:hello.txt,内容有3行:
hello world
hello python
seo
这个时候写了open()函数直接运行,是没有结果显示的(如下图)。
那么,打开了文件后怎么展示出文件内容呢?这时候就需要用到read()方法了。read()方法可以一次性将文件内的内容以字符串形式(包含文件的换行符)读取出来。
如果用“w”方法打开文件,只能是“写”模式,不能读取,此时再用read方法就会报错了。并且我们可以看到,原来文件内的内容已经没有了,被覆盖掉了(使用w或w+时,它都会默认先清空原来文件内的内容,再用新内容替换)。同理,“a”方法也是只能追加,不能读取,也不能用read方法,同样也会报错:
2
读取文件中的数据
* 使用read方法一次性读取所有的数据使用,包括换行符
* 使用readline方法每次只读取一行数据,包括换行符
* 使用readlines方法一次性读取完所有数据,包括换行符,并以列表的形式返回,列表中的每个元素就是原文件的一行
* 使用for循环迭代读取
* 使用列表推导式来将文件的每一行都读取到列表中去
read(),readline(),readlines()方法:
# read()方法读取全部数据
hello = open('hello.txt')
print(hello.read(),'\n')
# readline()方法读取一行数据
hello = open('hello.txt')
print(hello.readlinereadline())
# readlines()方法读取全部数据,并按行返回一个列表
hello = open('hello.txt')
print(hello.readlines())
使用for循环迭代读取文件数据
hello = open('hello.txt')
for line in hello:
print(line)
为什么上图的结果中每行数据间都会空一行呢?因为我们在print的时候就会默认换行,而文件中又包含了换行符,所以才会换行了两次。这个时候我们可以用strip方法来去掉换行符:
hello = open('hello.txt')
for line in hello:
print(line.strip())
使用迭代的方式对文件进行读写的好处在于比readlines等方法的速度更快,并且可以不用关闭文件,for()循环结束后会自动关闭文件。使用迭代的方法读写文件对大文件更有效。如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。
使用列表推导式
使用列表推导式来将文件的每一行都读取到列表中去:
hello = open('hello.txt')
lines = [line.strip() for line in open('hello.txt')]
print(lines)
注意事项:read()方法实质上是将未读取的文件部分一次性读取出来,为什么这么说呢?咱们来看看下面这个实例:
hello = open('hello.txt')
print(hello.readlinereadline())
print(hello.read())
原文件内有5行内容,所以我们看到,readline()读取了一行后,read()读取的其实是剩下的未读取4行内容部分,并不是每次都是从开始全部读取。readlines()方法也是如此。
python文件的读取方法有很多,比较推荐的是使用for循环和列表推导式来读取,这样会更加节省资源,也更灵活。明天我们将继续python文件写入的学习,另外还有文件对象的内建方法等内容,欢迎大家继续关注!
领取专属 10元无门槛券
私享最新 技术干货