1)我打开一个文件
2)运行re.findall()
按预期返回列表
3)然后我再次运行re.findall()
寻找其他东西,但它返回空列表。
但是,如果我在2和3之间再次打开文件,则第二个re.findall()
可以正常工作。
我无法弄清楚发生了什么,re
关闭文件了吗?或者是其他事情发生了什么?
感谢你提前给予的任何帮助!
这是我的代码
def extract_names(filenames):
for f in filenames: #grabs one file at a time
file = open(f, 'r') #opens file
#find year <h3 align="center">Popularity in 1992</h3>
year = re.search(r'Popularity\sin\s\d{4}', file.read())
print(year)
file = open(f, 'r') #reopen file
#find <tr align="right"><td>1</td><td>Michael</td><td>Ashley</td>
rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', file.read())
print(rank_names)
答案 0 :(得分:1)
file.read()
使用整个文件并将文件指针前进到文件末尾。对file.seek(0)
的后续调用只返回空字符串(因为文件已被使用)。您可以调用file.read()
将文件指针返回到文件的开头,但是当您只需读取一次并存储内容以避免额外的系统调用时,读取文件两次是愚蠢的。
如果您想多次搜索文件数据,请存储file.read()
的结果,并在您的通话中使用filedata = file.read() # Cache once
year = re.search(r'Popularity\sin\s\d{4}', filedata) # Search in cache
print(year)
#find <tr align="right"><td>1</td><td>Michael</td><td>Ashley</td>
rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', filedata) # Search cache again
print(rank_names)
而不是getBooleanExtra
,例如:
getBooleanExtra
答案 1 :(得分:1)
文件指针已移至file.read()
后的文件末尾,因此您无法再次使用file.read()
来获取此文件的全部内容。
您可以存储文件的内容以进行以下操作:
content = file.read()
year = re.search(r'Popularity\sin\s\d{4}', content)
rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', content)
file.close()
建议with
关键字用于可以自动关闭文件处理程序的文件操作:
for f in filenames:
with open(f, 'r') as file:
content = file.read()
答案 2 :(得分:0)
为什么不用str
命名read()
。
with open("filename", "rt") as f:
content = f.read()
现在您可以将对象称为content
,但是您可以多次这样做。 open()
操作越多,开销越大。当open()
返回迭代器时,read([chunk])
消耗 chunk
chunk
,直到什么都没有。这就是你第二次拿到一个空容器的原因。