提问人:helpermethod 提问时间:10/11/2010 最后编辑:Glen Sellehelpermethod 更新时间:1/15/2022 访问量:93746
为什么我不能在打开的文件上调用 read() 两次?
Why can't I call read() twice on an open file?
问:
对于我正在做的练习,我正在尝试使用该方法两次读取给定文件的内容。奇怪的是,当我第二次调用它时,它似乎没有将文件内容作为字符串返回?read()
代码如下
f = f.open()
# get the year
match = re.search(r'Popularity in (\d+)', f.read())
if match:
print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())
if matches:
# matches is always None
当然,我知道这不是最有效或最好的方法,这不是这里的重点。关键是,为什么我不能打两次电话?我必须重置文件句柄吗?或者关闭/重新打开文件以执行此操作?read()
答:
调用将读取整个文件,并将读取游标保留在文件末尾(没有其他内容可读取)。如果您希望一次读取一定数量的行,则可以使用 ,或使用 遍历行。read()
readline()
readlines()
for line in handle:
要直接回答您的问题,一旦读取了文件,您可以使用 将读取光标返回到文件的开头(文档在这里)。如果您知道文件不会太大,还可以将输出保存到变量中,并在表达式中使用它。read()
seek(0)
read()
findall
Ps.不要忘记在完成后关闭文件。
评论
自动使用。
读取指针移动到最后一个读取字节/字符之后。使用该方法将读取指针倒回开头。seek()
每个打开的文件都有一个关联的位置。
当你读()时,你从那个位置读。
例如,从新打开的文件中读取前 10 个字节,然后另一个读取接下来的 10 个字节。 Without Arguments 读取文件的所有内容,将文件位置保留在文件末尾。下次你打电话时,没有什么可读的。read(10)
read(10)
read()
read()
可用于移动文件位置。或者,在您的情况下,更好的做法是执行一个并保留两个搜索的结果。seek
read()
到目前为止,回答这个问题的每个人都是绝对正确的 - 在文件中移动,所以在你调用它之后,你不能再次调用它。read()
我要补充的是,在您的特定情况下,您不需要返回开头或重新打开文件,您只需将已阅读的文本存储在局部变量中,并在您的程序中使用两次或任意次数:
f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
# matches will now not always be None
评论
from pathlib import Path; text = Path(filename).read_text()
read()
消耗。因此,您可以重置文件,或在重新阅读之前寻求开始。或者,如果它适合您的任务,则可以使用它仅使用字节。read(n)
n
正如其他答案所建议的那样,您应该使用 .seek()
我只写一个例子:
>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output
我总是觉得阅读方法有点像走在一条黑暗的小巷里。你往下走一点,然后停下来,但如果你不计算你的步数,你就不确定你走了多远。Seek 通过重新定位来提供解决方案,另一个选项是 Tell,它返回沿文件的位置。可能是 Python 文件 api 可以将 read 和 seek 组合成一个read_from(position,bytes) 以使其更简单 - 在此之前,您应该阅读此页面。
评论