关于python:为什么我不能在打开的文件上两次调用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表达式中使用它。

附言完成操作后,不要忘记关闭文件;)

 相关讨论

 


是的,如上所述

我只写一个例子:

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

 

 


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

 相关讨论

 


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


每个打开的文件都有一个关联的位置。
当您读取()时,您将从该位置读取。
例如,read(10)从新打开的文件中读取前10个字节,然后另一个read(10)读取接下来的10个字节。
不带参数的read()读取文件的所有内容,将文件位置保留在文件末尾。下次调用read()时,没有任何内容可供阅读。

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


我总是发现读取方法有点像在黑暗的小巷中漫步。您会停下来停下来,但是如果您不计算步数,则不确定您走了多远。 Seek通过重新定位来提供解决方案,另一个选项是Tell,它返回沿文件的位置。可能是Python文件api可以将读取和查找合并为一个read_from(position,bytes)以使其变得更简单-在这种情况下,您应该阅读此页面。

 

 


read()消耗。因此,您可以重设文件,或在重新读取之前寻求开始。或者,如果适合您的任务,则可以使用read(n)仅消耗n字节。