对于我正在进行的练习,我试图使用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 :(得分: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。