2019年11月19日 / 496次阅读 / Last Modified 2020年10月1日
read函数可以带一个长度,用来控制每次读入的内容长度,这根内容直接相关,如果读取一个超大文件,read不带长度,程序可能直接卡死。
readline函数也可以带一个长度,表示在这个长度范围内,read a line,如果读取一个超大文件,文件中没有换行符,readline不带长度,程序可能直接卡死。
readlines虽然可以让代码更易写易读,但是其实很消耗内存, read all lines into memory,如果是很大的文件,这一定不是个good choice。当然,readlines也可以设置一个最大读取字节数,但是readlines函数总是会尝试读出一个完整的行出来。比如一行有10个bytes,readlines(2),也会把这10个bytes读出来。
要特别注意readline和readlines在给定参数时的behavior的不同!要时刻留意,你的代码read了多少bytes到内存中。
================程序员的思考================
python文件对象的read,readline和readlines,这三个函数都是用来读取文件的内容,从函数名称上可以看出一点细微的差异,本文对其进行详细介绍。
我们先创建一个用来做读取测试的文件:
$ echo -e '12345\nabcde\n14sdn854nd\nhahaha..' > test.txt
$ cat test.txt
12345
abcde
14sdn854nd
hahaha..
python文件对象的read函数很直接,就是读,如果不带参数,一口气就将文件内容全部读出来了。不过也可以带个参数,限制一下每次读取的长度。
>>> f = open('test.txt')
>>> f.read()
'12345\nabcde\n14sdn854nd\nhahaha..\n'
>>> f.seek(0)
0
>>> f.read(5)
'12345'
>>> f.read(5)
'\nabcd'
>>> f.read(5)
'e\n14s'
>>> f.read(5)
'dn854'
>>> f.read(5)
'nd\nha'
read函数不带参数,就一口气将文件内容全部读出;参数表示读取的字节数。(关于python文件对象的seek函数)
顾名思义,这个函数的作用就是读取文件的一行。
>>> f.seek(0)
0
>>> f.readline()
'12345\n'
>>> f.readline()
'abcde\n'
>>> f.readline()
'14sdn854nd\n'
>>> f.readline()
'hahaha..\n'
>>> f.readline()
''
readline的逻辑是,读取到EOF或换行为止,因此所以,readline函数也没有带一个参数,参数含义跟read一样,表示读取的最大字节数。不过,遇到换行或EOF,readline会返回。(read函数遇到EOF也返回了)
>>> f.seek(0)
0
>>> f.readline(2)
'12'
>>> f.readline(2)
'34'
>>> f.readline(2)
'5\n'
>>> f.readline(2)
'ab'
>>> f.readline(2)
'cd'
>>> f.readline(2)
'e\n'
>>> f.readline(2)
'14'
>>> f.readline(2)
'sd'
>>> f.readline(2)
'n8'
>>> f.readline(2)
'54'
>>> f.readline(2)
'nd'
>>> f.readline(2)
'\n'
readlines与上一个函数的区别,在于它将文件所有的行一次性读出来后,放入一个list对象中,在有循环操作的时候,这个函数用起来更方便。
>>> f.seek(0)
0
>>> f.readlines()
['12345\n', 'abcde\n', '14sdn854nd\n', 'hahaha..\n']
>>> f.tell()
32
跟read不带参数一样,一口去将文件读完,指针位置移动到文件最后,只是返回的是按行的list。
其实,readlines函数也可以带一个参数,参数的含义依然是字节数,不过函数的行为不是读取参数指定的字节数,而是读取符合指定字节数的行出来。请看如下代码:
>>> f.seek(0)
0
>>> f.readlines(10)
['12345\n', 'abcde\n']
>>> f.readlines(2)
['14sdn854nd\n']
>>> f.readlines(200)
['hahaha..\n']
>>> f.readlines(200)
[]
>>> f.close()
参数为10时,两行就满足了;参数为2时,只需要一行就满足了;参数为200时,遇到了EOF,只剩一行了;最后没有了,就返回空的list对象。
本文的测试代码一致使用f.seek(0)进行文件内容的重新读取,最后别忘了f.close()关闭文件。
根据功能需要,灵活选择python提供的文件对象内容读取的这三个函数。
-- EOF --
本文链接:https://www.pynote.net/archives/1528
《python文件对象的read,readline和readlines》有5条留言
前一篇:python文件对象的seek和tell
后一篇:Python的布尔操作
©Copyright 麦新杰 Since 2019 Python笔记
在python官方教程中,看到这样按行读取文件的方式:
[ ]超大文件慎用readlines [ ]
对应的,有write,和writelines,但是没有writeline [ ]
默认情况,这几个read函数都是阻塞的,会一直读到EOF才会停下来。 [ ]
如果文件很大,建议使用readline。如果使用read或readlines,建议使用参数配合。主要是考虑内存的占用。 [ ]