希望对Python新手有所帮助。我在其他问题中找不到我的问题,但如果是这样:抱歉。我基本上想做的是:
- 读取大量文本文件并在每个文件中搜索多个字符串术语。
- 如果搜索词匹配,则将相应的文件名存储到一个名为“filelist”的新文件中,以便我可以区分好文件和坏文件。
- 将“文件列表”导出到 Excel 或 CSV。
这是我到目前为止的代码:
#textfiles all contain only simple text e.g. "6 Apples"
filelist=[]
for file in os.listdir('C:/mydirectory/'):
with open('C:/mydirectory/' + file, encoding="Latin1") as f:
fine=f.read()
if re.search('APPLES',fine) or re.search('ORANGE',fine) or re.search('BANANA',fine):
filelist.append(file)
listoffiles = pd.DataFrame(filelist)
writer = pd.ExcelWriter('ListofFiles.xlsx', engine='xlsxwriter')
listoffiles.to_excel(writer,sheet_name='welcome',index=False)
writer.save()
print(filelist)
问题:
- 当然,有更优雅或更省时的方法吗?我需要对大量文件执行此操作:D
- 与前者相关,有没有办法解决使用pandas读入文件的问题?还是时间效率较低?对于我作为 STATA 用户来说,拥有一个数据框感觉更像是家......
- 我添加了“Latin1”选项,因为原始数据中的某些字符会在编码中产生冲突。有没有办法了解哪些字符导致了问题?我可以轻松摆脱这个吗,例如提前剪切第一行(也许可以跳过)?
最佳答案
只需几件事即可加快脚本速度:
1.) 预先编译正则表达式,而不是每次都在循环中编译(还可以使用 |
将多个字符串组合到一个正则表达式!
2.) 逐行读取文件,而不是一次全部读取!
3.) 使用any()
当您获得第一个肯定结果时终止搜索
例如:
import re
import os
filelist=[]
r = re.compile(r'APPLES|ORANGE|BANANA') # you can add flags=re.I for case insensitive search
for file in os.listdir('C:/mydirectory/'):
with open('C:/mydirectory/' + file, 'r', encoding='latin1') as f:
if any(r.search(line) for line in f): # read files line by line, not all content at once
filelist.append(file) # add to list
# convert list to pandas, etc...
关于python - 如何读取和搜索多个文本文件,以便存储与我的搜索匹配的文件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62537843/