问题:为什么我不能在打开的文件上两次调用read()?
对于我正在做的练习,我试图使用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()
两次电话?我是否需要重置文件句柄?还是关闭/重新打开文件以执行此操作?
回答 0
调用read()
将读取整个文件,并将读取的游标留在文件的末尾(仅读取其他内容)。如果您希望一次阅读一定数量的行,则可以使用readline()
,readlines()
或使用 遍历行for line in handle:
。
要直接回答您的问题,请在读取文件后read()
使用seek(0)
,将读取的光标返回到文件的开头(文档在此处)。如果您知道文件不会太大,也可以将read()
输出保存到变量中,并在findall表达式中使用它。
附言 完成操作后,不要忘记关闭文件;)
回答 1
是的,如上所述
我只写一个例子:
>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output
回答 2
到目前为止,回答此问题的每个人都是绝对正确的- 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
读指针移动到最后一个读字节/字符之后。使用该seek()
方法将读取的指针后退到开头。
回答 4
每个打开的文件都有一个关联的位置。
当您读取()时,您将从该位置读取。例如read(10)
,从一个新打开的文件中读取前10个字节,然后另一个read(10)
读取后10个字节。
read()
不带参数的文件将读取文件的所有内容,而将文件位置保留在文件末尾。下次调用时read()
,没有任何内容可供阅读。
您可以seek
用来移动文件位置。或者在您的情况下更好的方法是做一个read()
并保留两个搜索的结果。
回答 5
read()
消耗。因此,您可以重设文件,或在重新读取之前寻求开始。或者,如果它read(n)
适合您的任务,则可以用来仅消耗n
字节。
回答 6
我总是发现读取方法有点像在黑暗的小巷中漫步。您会停下来停下来,但是如果您不计算步数,则不确定您走了多远。Seek通过重新定位来提供解决方案,另一个选项是Tell,它返回沿文件的位置。可能是Python文件api可以将读取和查找合并为一个read_from(position,bytes)以使其更简单-直到发生这种情况,您应该阅读此页面。