从多个压缩文件夹中搜索多个 .csv 文件中的字符串

Posted

技术标签:

【中文标题】从多个压缩文件夹中搜索多个 .csv 文件中的字符串【英文标题】:Search for a string in multiple .csv files from a multiple zipped folders 【发布时间】:2022-01-07 16:54:02 【问题描述】:

我正在尝试执行一个脚本,该脚本将解压缩包含多个 txt 和 .csv 文件的压缩文件夹中的所有文件,仅在 .csv 文件中搜索字符串,如果它包含该字符串,则复制整个压缩文件夹到一个新文件夹,如果没有,请转到下一个压缩文件夹。我有几个脚本可以完成其中的一部分,但无法将它们拼凑在一起。我是python的初学者,所以这个脚本看起来很复杂。

这个脚本打印压缩文件夹中的文件,我的下一步是在它包含的 .csv 文件中搜索字符串 PROGRAM 但我不知道如何编码,我想它在最后这段代码,因为它看起来像是在循环中运行。

import os
import pandas as pd
import zipfile

curDir = os.getcwd()
zf = zipfile.ZipFile(curDir + '\namedfile.zip')
text_files = zf.infolist()
list_ = []

print ("Uncompressing and reading data... ")

for text_file in text_files:
    print(text_file.filename)

我单独编写了这个脚本,在包含 .csv 文件的文件夹中搜索字符串 PROGRAM

import os
from pathlib import Path

#Searches the .csv files within the "AllCSVFiles"
#folder for the string "GBSD"

search_path = "./AllCSVFiles"
file_type = ".csv"
search_str = "PROGRAM"

if not (search_path.endswith("/") or search_path.endswith("\\") ): 
        search_path = search_path + "/"
                                                          
if not os.path.exists(search_path):
        search_path ="."


for fname in os.listdir(path=search_path):
   if fname.endswith(file_type):
        fo = open(search_path + fname)
        line = fo.readline()
        line_no = 1
        while line != '' :
                index = line.find(search_str)
                if ( index != -1) :    
                    print(fname, "[", line_no, ",", index, "] ", sep="")

                line = fo.readline()  
                line_no += 1 
        fo.close()

有没有更简单的方法来处理这段代码?

【问题讨论】:

嗨,您也许可以使用zipgrep 或在循环结束时在匹配时复制文件夹。也许将这些方法组合到一个类中,以便更容易执行该过程。 【参考方案1】:

我认为首先要确保您了解解决方案的结构。

阅读您的描述,我会说是这样的:

# Create empty list, for marked zip file

# Iterate over zip files
    # Unzip
    # Iterate over files
        # If file ends in .csv
            # If file contains SEARCH_STR
                # Mark this zip file to be copied
                # Stop searching this zip file

# Iterate marked zip files
    # Copy zip file to DEST_DIR

如果这是结构,这是否足以帮助您了解代码的放置位置?

之后,您可以清理一下文件中对search_str 的搜索:

with open(search_path + fname) as csv_file:
    line_no = 0
    for line in csv_file:
        line_no += 1
        if search_str in line:
            search_index = line.index(search_str)
            print(f'fname[line_no,search_index]')
            # Mark the zip file this csv_file is in
            # figure out how to stop searching this zip file
for line in csv_file:在 Python 中打开的文本文件具有用于迭代行的内置机制 if search_str in line:如果您不需要知道 search_str 的确切位置,只需测试 membershipsearch_str 是否在字符串 line 中?

【讨论】:

以上是关于从多个压缩文件夹中搜索多个 .csv 文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个文件中搜索字符串并在 Excel 或 Powershell 中的 csv 中返回带有行号/文本的文件名

如何从压缩文件中读取多个文件?

如何将包含 30 多个压缩文件的文件夹存储到 r 中的变量中

利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件

如何在 csv/文本文件上一次计算多个字符串或一个字符串,并使用 powershell 返回包含列表数据中的字符串的值

从多个csv中提取列名前几个字符的列