自动化提取ZIP文件中的TXT内容并汇总至Excel文件
编辑这段代码的主要作用是从指定目录中提取所有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
函数。
总结
这段代码的整体流程如下:
设置默认编码为UTF-8。
遍历指定目录下的所有ZIP文件。
解压每个ZIP文件,提取其中的TXT文件内容。
将提取的信息整理成一个数据列表。
将数据列表写入到一个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()
- 6
- 0
-
分享