在Python中多次计算文件中行数

3
为什么第二个调用:
num_lines = len(file.read().split("\n")) - 1

返回0而不是正确的值?

with open("Data.txt", "r+") as file:
    num_lines = len(file.read().split("\n")) - 1
    print("Old num_lines: " + str(num_lines))

    # Add 10 new lines of data to end of the file
    for i in range(num_lines, num_lines + 10):
        file.write("{}, {}\n".format(i, random.randint(0, 10)))

    num_lines = len(file.read().split("\n")) - 1
    print("New num_lines: " + str(num_lines))

因为你已经读完整个文件,所以没有剩下的可读内容了。你需要将文件倒回或重新打开文件。 - Błotosmętek
3个回答

2

读取文件就像读书一样,你需要一个书签来记录你的进度。

当你打开一个文件时,这个“书签”会处于初始位置,在读取了部分内容后,它会被移动以记住下一组要读取的字节。

你的第二个

 num_lines = len(file.read().split("\n")) - 1

在整个文件读取完毕后,它与所有其他读取的内容位于同一块中。"书签"已经到达文件末尾。

我建议在第一次读取时保存初始行数,而不是重新读取文件:

old_num_lines = num_lines = len(file.read().split("\n")) - 1

无论如何,回到文件开头也很简单,只需使用seek()方法:

file.seek(0)

2
应该补充说明,为了返回文件开头,您应该使用file.seek(0)。 - Gal
很好的比喻。谢谢! - Corey Stern
@RobertoCaboni 你说得对,但我认为第一个答案提出的解决方案和你详细的类比结合起来可能会更好,仅此而已。 - Gal

1
你只能读取文件一次,否则将无法再次读取,并且寻找指针已经到达了文件末尾。
你需要将寻找指针定位到文件开头。
file.seek(0)

尝试再次阅读文件之前。

顺便说一下,您无需再次读取文件。如果您在代码中添加了10行到文件中,则新的行数将为:

num_lines += 10

谢谢!我知道你可以把变量加10,我只是想练习读取数据。不过还是谢谢你的建议! - Corey Stern

0

你可以使用以下代码打开文件 (with open("Data.txt", "r+") as file)。读取一些内容后,会改变当前文件的位置。第一个“read”操作将位置设置在文件的末尾。

然后,你写入一些内容,这将继续将当前位置移动到文件的末尾。

最后,你执行另一个file.read()。这意味着“从文件中的当前位置开始读取N个字节”。由于当前位置是文件的末尾,所以你什么也没读取。

请查看官方文档以获取更多详细信息。


谢谢您的帮助! - Corey Stern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接