Python 3 re.findall关闭文件?

时间:2016-04-06 02:17:39

标签: regex python-3.x

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)

3 个答案:

答案 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

旁注:Use a real HTML parser

答案 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,直到什么都没有。这就是你第二次拿到一个空容器的原因。