悠米是只猫

悠米是只猫

自动化提取ZIP文件中的TXT内容并汇总至Excel文件

2024-12-23

这段代码的主要作用是从指定目录中提取所有ZIP文件中的TXT文件内容,并将这些信息整理后写入到一个Excel文件中。以下是对代码的详细解释:

1. 导入必要的模块

import os
import zipfile
import glob
import pandas as pd
import shutil
import sys
import importlib

这些模块分别用于文件操作、压缩文件处理、路径匹配、数据处理和Excel文件操作。

2. 设置默认编码为UTF-8

if sys.getdefaultencoding() != 'utf-8':
    importlib.reload(sys)
    sys.setdefaultencoding('utf-8')

这一步是为了确保脚本能够正确处理中文字符,避免编码问题。

3. 提取ZIP文件信息的函数

def extract_zip_info(directory):
    ...

这个函数的作用是遍历指定目录下的所有ZIP文件,解压每个ZIP文件,提取其中的TXT文件内容,并将这些信息存储在一个列表中。

  • 获取ZIP文件列表:使用glob.glob获取目录下所有ZIP文件的路径。

  • 遍历ZIP文件:对于每个ZIP文件,获取其基本名称,并创建一个解压目录。

  • 解压ZIP文件:使用zipfile.ZipFile打开并解压ZIP文件到指定目录。

  • 获取TXT文件列表:使用glob.glob递归获取解压目录下的所有TXT文件。

  • 读取TXT文件内容:对于每个TXT文件,读取其内容,并将相关信息(压缩包名称、TXT文件名、文本内容)添加到数据列表中。

  • 删除解压目录:使用shutil.rmtree删除解压后的文件夹。

4. 将数据写入Excel文件的函数

def write_to_excel(data, excel_path):
    ...

这个函数的作用是将提取的数据写入到一个Excel文件中。

  • 创建DataFrame:使用pandas.DataFrame将数据列表转换为DataFrame。

  • 检查Excel文件是否存在:如果Excel文件不存在,则创建一个新的Excel文件并写入数据;如果Excel文件已存在,则读取现有数据,合并新旧数据,并写入到Excel文件中。

5. 主函数

def main():
    ...

主函数的作用是协调上述两个函数的执行。

  • 获取当前工作目录:使用os.getcwd获取当前工作目录。

  • 设置Excel文件路径:将Excel文件保存路径设置为当前工作目录下的数据模板.xlsx

  • 提取ZIP文件信息:调用extract_zip_info函数提取ZIP文件信息。

  • 写入Excel文件:调用write_to_excel函数将提取的数据写入Excel文件。

6. 脚本入口

if __name__ == "__main__":
    main()

这行代码确保当脚本作为主程序运行时,执行main函数。

总结

这段代码的整体流程如下:

  1. 设置默认编码为UTF-8。

  2. 遍历指定目录下的所有ZIP文件。

  3. 解压每个ZIP文件,提取其中的TXT文件内容。

  4. 将提取的信息整理成一个数据列表。

  5. 将数据列表写入到一个Excel文件中,如果Excel文件已存在,则追加数据。

通过这种方式,可以自动化地从多个ZIP文件中提取TXT文件内容,并将这些信息集中管理到一个Excel文件中,便于后续的数据分析和处理。

完整源代码

import os
import zipfile
import glob
import pandas as pd
import shutil
import sys
import importlib

# 设置默认编码为 UTF-8,以确保可以正确处理中文字符
if sys.getdefaultencoding() != 'utf-8':
    importlib.reload(sys)
    sys.setdefaultencoding('utf-8')

# 定义一个函数,用于提取指定目录下所有ZIP文件的信息
def extract_zip_info(directory):
    print("开始提取 ZIP 文件信息...")
    data = []  # 初始化一个空列表,用于存储提取的数据
    zip_files = glob.glob(os.path.join(directory, '*.zip'))  # 获取目录下所有ZIP文件的路径
    print(f"找到 {len(zip_files)} 个 ZIP 文件.")

    for zip_file in zip_files:  # 遍历每个ZIP文件
        print(f"处理 ZIP 文件: {zip_file}")
        base_name = zip_file.split(os.path.sep)[-1].split('.zip')[0]  # 获取ZIP文件的基本名称
        base_name_before_dash = base_name.split('-')[0].strip()  # 获取ZIP文件名中破折号前的部分

        with zipfile.ZipFile(zip_file, 'r') as zf:  # 打开ZIP文件
            extract_dir = os.path.join(directory, f"{base_name}_extracted")  # 创建解压目录
            zf.extractall(path=extract_dir)  # 解压ZIP文件到指定目录
            print(f"解压到: {extract_dir}")

        txt_files = glob.glob(os.path.join(extract_dir, '**', '*.txt'), recursive=True)  # 获取解压目录下所有TXT文件的路径
        print(f"在 {extract_dir} 中找到 {len(txt_files)} 个 TXT 文件.")

        for txt_file in txt_files:  # 遍历每个TXT文件
            txt_name_without_ext = os.path.splitext(os.path.basename(txt_file))[0]  # 获取TXT文件的基本名称(无扩展名)
            print(f"读取 TXT 文件: {txt_file}")

            with open(txt_file, 'r', encoding='utf-8') as f:  # 打开TXT文件
                content = f.read()  # 读取文件内容

            data.append({  # 将提取的信息添加到数据列表中
                '压缩包名称': base_name_before_dash,
                'TXT文件名': txt_name_without_ext,
                '文本内容': content
            })

        shutil.rmtree(extract_dir)  # 删除解压后的文件夹
        print(f"删除解压文件夹: {extract_dir}")

    print("完成提取 ZIP 文件信息.")
    return data  # 返回提取的数据列表

# 定义一个函数,用于将数据写入Excel文件
def write_to_excel(data, excel_path):
    print("开始写入 Excel 文件...")
    df = pd.DataFrame(data)  # 将数据列表转换为DataFrame
    if not os.path.exists(excel_path):  # 如果Excel文件不存在
        with pd.ExcelWriter(excel_path, engine='openpyxl') as writer:  # 创建新的Excel文件
            df.to_excel(writer, sheet_name='Sheet1', index=False)
        print(f"创建新的 Excel 文件: {excel_path}")
    else:  # 如果Excel文件已存在
        existing_df = pd.read_excel(excel_path, sheet_name='Sheet1')  # 读取现有数据
        combined_df = pd.concat([existing_df, df], ignore_index=True)  # 合并新旧数据
        with pd.ExcelWriter(excel_path, engine='openpyxl', mode='w') as writer:  # 写入合并后的数据
            combined_df.to_excel(writer, sheet_name='Sheet1', index=False)
        print(f"追加数据到 Excel 文件: {excel_path}")

    print("完成写入 Excel 文件.")

# 定义主函数
def main():
    current_directory = os.getcwd()  # 获取当前工作目录
    excel_file = os.path.join(current_directory, '数据模板.xlsx')  # 设置Excel文件的保存路径
    print(f"当前工作目录: {current_directory}")
    print(f"Excel 文件将保存为: {excel_file}")

    extracted_data = extract_zip_info(current_directory)  # 调用函数提取ZIP文件信息
    write_to_excel(extracted_data, excel_file)  # 调用函数将数据写入Excel文件
    print("所有数据已成功写入 Excel 文件.")

# 如果这个脚本是作为主程序运行,则执行main函数
if __name__ == "__main__":
    main()