为什么我不能在打开的文件上调用read()两次?

时间:2010-10-11 12:25:39

标签: python io

对于我正在进行的练习,我试图使用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()?我是否必须重置文件句柄?或者关闭/重新打开文件以便这样做?

7 个答案:

答案 0 :(得分:131)

调用read()读取整个文件,并将读取光标留在文件的末尾(没有更多要阅读的内容)。如果您希望一次只读取一定数量的行,可以使用readline()readlines()或使用for line in handle:遍历行。

要直接回答您的问题,一旦读取了文件,使用read(),您可以使用seek(0)将读取光标返回到文件的开头(文档为here) 。如果您知道文件不会太大,您还可以将read()输出保存到变量中,并在findall表达式中使用它。

聚苯乙烯。完成后不要忘记关闭文件;)

答案 1 :(得分:21)

是的,如上所述......

我只会写一个例子:

>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output

答案 2 :(得分:16)

到目前为止,每个回答过这个问题的人都是绝对正确的 - 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

答案 3 :(得分:13)

读指针移动到最后读取的字节/字符之后。使用seek()方法将读指针倒回到开头。

答案 4 :(得分:2)

每个打开的文件都有一个相关的位置 当你读()时,你从那个位置读。 例如,read(10)从新打开的文件中读取前10个字节,然后另一个read(10)读取接下来的10个字节。 不带参数的read()读取文件的所有内容,将文件位置保留在文件末尾。下次致电read()时,无需阅读。

您可以使用seek移动文件位置。或者在您的情况下可能更好的做一个read()并保留两次搜索的结果。

答案 5 :(得分:1)

read() 消费。因此,您可以重置文件,或者在重新阅读之前搜索到开头。或者,如果它适合您的任务,您可以使用read(n)仅消耗n个字节。

答案 6 :(得分:1)

我总是觉得读取方法是走在黑暗的小巷里。你走了一段路然后停下来,但如果你不计算你的步数,你就不知道你走了多远。 Seek通过重新定位给出解决方案,另一个选项是Tell,它返回文件中的位置。可能是Python文件api可以将read和seek组合成read_from(位置,字节)以使其更简单 - 直到发生这种情况你应该阅读this page