python - 如何读取和搜索多个文本文件,以便存储与我的搜索匹配的文件列表?

标签 python loops text-files

希望对Python新手有所帮助。我在其他问题中找不到我的问题,但如果是这样:抱歉。我基本上想做的是:

  1. 读取大量文本文件并在每个文件中搜索多个字符串术语。
  2. 如果搜索词匹配,则将相应的文件名存储到一个名为“filelist”的新文件中,以便我可以区分好文件和坏文件。
  3. 将“文件列表”导出到 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)

问题:

  1. 当然,有更优雅或更省时的方法吗?我需要对大量文件执行此操作:D
  2. 与前者相关,有没有办法解决使用pandas读入文件的问题?还是时间效率较低?对于我作为 STATA 用户来说,拥有一个数据框感觉更像是家......
  3. 我添加了“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/

相关文章:

Python 对多个文本文件中的某些值求和

python - 我正在尝试使用 for 循环打印 .txt 文件的多行。它总是缺少最后三行

javascript - 在 React 中使用索引作为键。什么时候有影响,什么时候没有影响?

python - 如何在 Pandas 数据框列中选择一系列值?

python - 在 python 或 django 中将类对象列表转换为 json

c# - 钟形曲线高斯算法(Python 和/或 C#)

javascript - 如何解决 Javascript map 循环不适用于每个 div 标签?

java - 带 for 循环的 PrintWriter

linux - 确定哪些关键字可以在哪些文件中找到

python - 为没有名称的数据框列命名