下面的代码是为每个循环读取一行还是在开始迭代之前先将整个文件读入内存?
for line in f:
print(line)
我的意图是从文件中读取一行。
答案 0 :(得分:4)
你不能确定。所有你能知道的是,它一次返回一行。 Python Standard Library documentation说: 为了使for循环成为循环文件行的最有效方式(一种非常常见的操作),next()方法使用隐藏的预读缓冲区。使用预读缓冲区的结果是,将next()与其他文件方法(如readline())相结合不能正常工作。
我的理解是,预读缓冲区加载一个完整的块(未确定的大小)并在该缓冲区中查找行尾。但是对于一个小文件(几个ko),你可以确定只有一个物理读取。我曾经尝试在一个小文件(大约50行)上获得read
的第一行后放next
,并在文件末尾找到文件指针。
当然对于一个非常大的文件,它一次只能读取物理一个块,而python内存一次只能使用一行。所以它比readlines()
更加保守。但是,毕竟,在常见的系统(类Unix,Mac OS或Windows)上,文件(*)上的基础读取系统调用没有行结束的概念,并且可以只读取(最大)字节数。因此,在这些系统上无法物理读取到行尾,您使用的任何语言。您只能使用加载内部缓冲区的实用程序,然后在该缓冲区中查找行尾。这就是next()
方法对Python中文件对象的作用。
在你的评论之后,我知道你试图只获得第一线。你可以用:
line = f.next()
但是之后不要尝试使用任何read
方法,因为正如我上面解释的那样,文件指针可能远远超出第一行的结尾。
(*)从控制台或终端设备读取时不一样......
答案 1 :(得分:0)
一次只能使用一行,而不是一次将整个内容读入内存。这就是为什么它recommended so often。
答案 2 :(得分:0)
如果您需要做的只是读取一行,然后是二进制数据,则无论如何都需要以二进制模式打开文件。然后很容易模仿Python在读取行时所做的事情:读入临时缓冲区并搜索换行符。我假设文本是8位ASCII兼容编码。您需要为max_line_size
选择一些合理的最大行长度,否则算法会变得更加复杂。
with open(filename, 'rb') as f:
buffer = f.read(max_line_size)
len = buffer.find(b'\n')
if len < 0:
raise RuntimeError('Line in file too long')
line = buffer[:len]
line = line.decode()
f.seek(len + 1)
答案 3 :(得分:-2)
您可以这样做或者这样做:
f = open(' a file');
s = f.readlines(): # Read all lines, no looping
Python docs中提到了这一点。还有一个list(f)
可以让您将这些行列为列表中的项目