read()和readline()能一起使用吗?

5

在Python中,是否可以同时使用read()和readline()来读取同一个文本文件?

当我尝试这样做时,只有第一个读取函数会执行。

file = open(name, "r")
inside = file.readline()
inside2 = file.read()

print(name)
print(inside)
print(inside2)

结果仅显示inside变量,而不是inside2

2
Related - wnnmaw
你使用的是哪个版本的Python?你的代码在我这里看起来运行良好。 - B. Eckles
1
请注意,首先使用readline函数后,调用read函数将不会读取文件的第一行。因此,如果你的文件只有一行内容,那么在调用read函数时将不会输出任何内容。 - B. Eckles
1
一个吹毛求疵的用词问题,你并不是同时使用它们,而是连续使用它们,这是一个重要的区别。 - Chris_Rands
@B.Eckles 是的,我都读了,现在我明白了如何使用书籍类比和 seek() 函数来解释它们 :)) - JoanLamrack
显示剩余3条评论
2个回答

6

读取文件就像读书一样。当你使用.read()时,它会一直读到书的末尾。如果你再次使用.read(),那么你忘记了翻回到开始的那一页。除非你把页面翻回到开头,否则不能再次阅读它。如果你使用.readline(),我们可以把它称为一页。它告诉你页面的内容,然后翻到下一页。现在,使用.read()会从那一页开始,并一直读到末尾。这第一页不包括在内。如果你想从开头开始读取,你需要翻回到第一页。做到这一点的方法是使用.seek()方法。它接受一个单一的参数:要查找的字符位置:

with open(name, 'r') as file:
    inside = file.readline()
    file.seek(0)
    inside2 = file.read()

还有另一种从文件中读取信息的方式。当您使用for循环时,它会在幕后使用:

with open(name) as file:
    for line in file:
        ...

那种方法是next(file),它会给你下一行。然而这种方式有点特殊。如果在next(file)之后使用file.readline()file.read(),你将会得到一个错误,因为混合迭代和读取方法会丢失数据。(感谢Sven Marnach指出这一点。)

请注意,在Python 2中,您不能混合使用 next(file)file.readline() - Sven Marnach
@SvenMarnach:哦,我不知道那个。如果你这样做会发生什么? - Tim Pietzcker
3
这段话的意思是:next() 使用一个单独的缓冲区,而 readline() 不会看到这个缓冲区。因此,在使用 next(f) 后调用 f.readline() 时,你可能会跳过文件的某些部分。 - Sven Marnach
@SvenMarnach:有趣的一点。我自己不知道,但现在已经添加到答案中了。 - zondo
@MosesKoledoye 这是有文档记录的行为,并且可以参考 https://dev59.com/QmEh5IYBdhLWcg3wpE3w - Sven Marnach
显示剩余2条评论

1

可以的。

file.readline() 从文件中读取一行(在这种情况下是第一行),然后 file.read()seek 位置开始读取文件的其余部分,即从 file.readline() 结束的位置开始。

你使用 f.read() 接收到一个空字符串,可能是因为你在使用 file.readline() 读取第一行后立即到达了文件结尾(EOF),这意味着你的文件只包含一行。

但是你可以通过将 seek 位置移动到开头来返回到文件的开头,使用 f.seek(0)


这让我对这两个函数有了初步的了解。谢谢! - JoanLamrack

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