Python文件read()和readline()计数器?

Python文件read()和readline()计数器?,python,python-3.x,file,Python,Python 3.x,File,看起来python跟踪read()和readline()的每次运行。它是增量的,通过reach run,最终不会返回任何值。如何找到此计数器,并随时读取特定行 编辑:我的目标是读取一个大小为几Gb、数十万行的大文件。如果这是一个迭代器,那么它是不够的,我不想在内存中加载整个文件。我如何跳转到特定行而不必阅读不必要的行 只有3行的文本文件 # cat sample.txt This is a sample text file. This is line 1 This is line 2 This

看起来python跟踪read()和readline()的每次运行。它是增量的,通过reach run,最终不会返回任何值。如何找到此计数器,并随时读取特定行


编辑:我的目标是读取一个大小为几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()
''
>>>

Python中的文件对象是迭代器,它在文件中的不同行上进行迭代。您可以使用
readlines()
一次将所有(剩余)行读取到列表中,或使用
read()
读取文件中的单个或所有(剩余)字符(默认为all,使用参数表示要读取的字符数),但默认行为(如果直接迭代文件)与
readline
相同,即从文件中产生下一行

您可以将其与
enumerate
结合使用,以获得另一个迭代器,该迭代器生成每行的行号(第一行的编号为
0
,除非您指定
enumerate
start
参数),或者获取特定行:

>>> f = open("test.txt")
>>> lines = enumerate(f)
>>> next(lines)
(0, 'first line\n')
>>> next(lines)
(1, 'second line\n')
>>> next(lines)
(2, 'third line\n')

>>> f = open("test.txt")
>>> lines = enumerate(f)
>>> next(l for i, l in lines if i == 3)
'fourth line\n'
还有
seek
方法,可用于跳转到文件中的特定字符,这对于将文件“重置”到第一个位置(或者重新打开文件)很有用,但对于查找特定行没有多大帮助,除非您知道每行的确切长度。(见下文)

如果您想“以任何顺序读取任何行”,最简单的方法是使用
readlines
将所有行实际读取到列表中,然后访问该列表中的项目(前提是您的文件不太大)



我的目标是读取一个大小为几Gb、数十万行的大文件

由于Python知道行的结束位置以及特定行的开始位置的唯一方法是计算它遇到的
\n
字符数,因此无法读取整个文件。如果文件非常大,并且您必须按顺序重复读取行,那么最好一次读取一行文件,并将每行的起始位置存储在字典中。之后,您可以使用
seek
快速跳转到某一行,然后读取该行

f = open("test.txt")
total = 1
lines = {}
for i, line in enumerate(f):
    lines[i] = total - 1
    total += len(line)
# jump to and read individual lines
f.seek(lines[3])
print(f.readline())
f.seek(lines[0])
print(f.readline())
使用
readline()
时,文件对象(即来自
open(file)
)的行为就像迭代器一样。就其本身而言,没有计数器。如果您运行
文件,则可以观察到这一点。\uu下一步\uu()
代替
文件.readline()

如果您不介意一次读取整个文件,那么简单的解决方案就是创建一个包含所有行的列表,然后引用您感兴趣的行,如下所示

lines=file.readlines() # this is a list

不知道你到底想要什么。您可以将
readline
enumerate
组合,以获得行号和实际行的元组。@tobias_k我想以任何顺序读取任何行。下面是我使用的
readline()
它递增,转到下一行,并在末尾停止赋值。在哪里指定要读取的行号?在我使用过一次后,为什么我不能使用user
read()
file.tell()
将当前偏移量返回到文件中。它不会告诉您想要的行,因为文件本身实际上不是一个行的集合,而是一个字节的集合。
readline
方法只是读取,直到找到下一个换行符;文件本身不关心行。如果将文件视为迭代器,则可以使用
enumerate(file)
创建一个迭代器,该迭代器生成行号/行对,而不仅仅是行。值得注意的是:由于迭代器有自己的缓冲,不要将
next
read
/
readline
与同一文件对象混合使用。我的目标是读取大小为几Gb、数十万行的大型文件。如果这是一个迭代器,那么它是不够的,我不想在内存中加载整个文件。我怎样才能跳转到一个特定的行而不必阅读不必要的行?@KapishM我认为你做不到。毕竟,Python“知道”它当前在哪一行的唯一方法是通过计数
\n
字符。请参阅我对
seek
的评论。读台词直到你找到你的台词似乎是最好的选择。如果必须重复执行此操作,您可以创建一个字典,将行号映射到文件中的位置,以便在重新访问行时可以使用
seek
。@tobias_k这对我有用。我可以来回读任何一行。谢谢…@tobias_k将
打开
仍将整个文件加载到内存中,是否将整个文件加载到
枚举
?谢谢。我看到
file.readlines()
给了我一个所有行的数组。
lines=file.readlines() # this is a list