看起来python会跟踪read()和readline()的每一次运行,它是递增的,每一次运行,最后,它不返回任何值,如何找到这个计数器,并在任何时候读取特定的行?
编辑:我的目标是读取一个几GB大小的大文件,几十万行。如果这是一个迭代器,那么它是不够的,我不想在内存中加载整个文件。我如何跳转到一个特定的行,而不必读取不必要的行?
只有3行的文本文件。
# cat sample.txt
This is a sample text file. This is line 1
This is line 2
This is line 3
# python
Python 3.7.5 (default, Nov 7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> file = open('sample.txt', 'r')
>>> file.readline()
'This is a sample text file. This is line 1\n'
>>> file.readline()
'This is line 2\n'
>>> file.readline()
'This is line 3\n'
>>> file.readline()
''
>>> file.readline()
''
>>> file.read()
''
>>> file.read(0)
''
>>> file.read()
''
>>>
# python
Python 3.7.5 (default, Nov 7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> file = open('sample.txt', 'r')
>>> file.read()
'This is a sample text file. This is line 1\nThis is line 2\nThis is line 3\n'
>>> file.read()
''
>>> file.readline()
''
>>>
2条答案
按热度按时间gwbalxhn1#
Python中的file对象是一个迭代器,迭代文件中的不同行。(剩余)行一次写入列表,或
read()
读取单个或全部文件中的(剩余)个字符(默认值为all,使用参数表示要读取的字符数),但是默认行为(如果直接迭代文件)与readline
相同,即从文件中产生下一行。你可以把它和
enumerate
结合起来,得到另一个迭代器,生成每一行沿着行号(第一行的行号是0
,除非你指定了enumerate
的start
参数),或者得到一个特定的行:还有
seek
方法,它可以用来跳转到文件中的特定字符,这对于将文件“重置”到第一个位置(或者重新打开它)很有用,但是对于查找特定行没有多大帮助,除非您知道每行的确切长度(见下文)。如果你想“以任意顺序读取任意行”,最简单的方法是使用
readlines
将所有行读入一个列表,然后访问该列表中的项(假设你的文件不是太大)。我的目标是读取几GB大小、数十万行的大文件。
因为Python知道一行的结束位置,也就是一个特定行的开始位置的唯一方法,就是计算它遇到的
\n
字符的数量,所以没有办法阅读整个文件,如果文件非常大,你不得不重复地无序读取行,那么一次读取一行文件可能是有意义的。将每行的起始位置存储在字典中,然后可以使用seek
快速跳转到特定行并读取。des4xlb02#
当使用
readline()
时,文件对象(即来自open(file)
)表现为迭代器。本质上没有计数器。如果您运行file.__next__()
代替file.readline()
,则可以观察到这一点。如果您不介意一次阅读整个文件,简单的解决方案是创建一个包含所有行的列表,然后引用您感兴趣的行,如