如何使用Pandas读取ZIP文件中多文件夹下的多个.txt文件?
处理嵌套ZIP文件的单词统计与标签分配方案
嘿,作为Python和ML新手,能精准说出需求已经很棒啦!针对你这种嵌套结构的ZIP文件(里面包含子文件夹,每个文件夹下有多个txt文件),咱们完全可以用Python自带的工具实现需求,不用复杂的第三方库(当然后续如果要整合到ML流程里,Pandas也能用上)。我给你写一套分步实现的代码,每一步都加注释,保证你能看懂~
核心思路
- 用Python自带的
zipfile模块直接读取ZIP文件,不用提前解压(节省空间,也更高效) - 遍历ZIP里的所有文件项,筛选出子文件夹下的
.txt文件 - 对每个txt文件,读取内容、清洗单词(去标点、转小写)
- 统计每个单词的出现次数,同时把所在的文件夹名作为该文件的标签(比如Folder1里的文件标签就是
Folder1) - 把结果整理成结构化的格式,方便后续ML使用
完整代码实现
import zipfile import string from collections import Counter # 定义一个函数:清洗文本,把字符串转换成干净的单词列表 def clean_text(text): # 1. 把所有字符转成小写,避免"Hello"和"hello"被算作不同单词 text = text.lower() # 2. 去掉所有标点符号(比如逗号、句号、感叹号) translator = str.maketrans('', '', string.punctuation) text_clean = text.translate(translator) # 3. 按空格分割成单词,过滤掉空字符串(比如连续空格导致的空项) words = [word for word in text_clean.split() if word] return words # 主函数:处理ZIP文件 def process_zip(zip_path): # 用来存储所有结果的列表,每个元素是一个字典,包含标签、文件名、单词统计 results = [] # 打开ZIP文件('r'表示只读模式) with zipfile.ZipFile(zip_path, 'r') as zip_ref: # 遍历ZIP里的每一个文件/文件夹项 for file_info in zip_ref.infolist(): # 跳过文件夹本身(因为zipfile会把文件夹也当作一个项) if file_info.is_dir(): continue # 只处理.txt文件,并且文件在子文件夹里(路径包含'/',比如Folder1/file1.txt) if file_info.filename.endswith('.txt') and '/' in file_info.filename: # 拆分路径:获取文件夹名和文件名,比如把'Folder1/file1.txt'拆成['Folder1', 'file1.txt'] folder_name, file_name = file_info.filename.split('/', 1) # 读取文件内容(注意指定编码,避免乱码,一般用utf-8) with zip_ref.open(file_info.filename) as file: # 把字节流转成字符串 content = file.read().decode('utf-8') # 清洗文本得到单词列表 words = clean_text(content) # 统计单词出现次数,用Counter很方便 word_count = Counter(words) # 把结果添加到列表里,标签就是文件夹名 results.append({ '标签': folder_name, '文件名': file_name, '单词统计': dict(word_count) }) return results # 调用示例:替换成你的ZIP文件路径 if __name__ == '__main__': zip_file_path = 'your_zip_file.zip' # 这里改成你的.zip1文件路径 final_results = process_zip(zip_file_path) # 打印结果,方便查看 for item in final_results: print(f"===== 标签: {item['标签']}, 文件: {item['文件名']} =====") for word, count in item['单词统计'].items(): print(f"{word}: {count}") print()
关键部分解释
zipfile.ZipFile:Python自带的模块,无需额外安装,能直接操作ZIP文件,不用解压,非常适合处理大ZIP文件clean_text函数:处理文本的标准化步骤,这是NLP(自然语言处理)里的基础操作,转小写是为了统一单词格式,去标点是避免"world."和"world"被当成不同单词Counter:collections模块里的工具,能快速统计列表中元素的出现次数,比手动用字典统计更简洁- 标签分配:这里直接用文件所在的文件夹名作为标签(比如Folder1下的所有文件标签都是Folder1),如果你的需求是其他类型的标签,可以直接修改
folder_name对应的部分
适合ML新手的后续扩展
如果你想把这些数据用到机器学习里(比如做文本分类),可以用Pandas把结果转成DataFrame,或者生成词频矩阵:
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer # 先重新获取文本和标签(如果已经有final_results也可以直接提取) with zipfile.ZipFile('your_zip_file.zip', 'r') as zip_ref: # 获取所有符合条件的文件内容(转成空格分隔的字符串) texts = [] labels = [] for info in zip_ref.infolist(): if not info.is_dir() and info.filename.endswith('.txt') and '/' in info.filename: content = zip_ref.open(info.filename).read().decode('utf-8') texts.append(' '.join(clean_text(content))) labels.append(info.filename.split('/',1)[0]) # 生成词频矩阵(每个文件一行,每个单词一列,值是出现次数) vectorizer = CountVectorizer() word_matrix = vectorizer.fit_transform(texts) # 转成DataFrame查看 word_df = pd.DataFrame(word_matrix.toarray(), columns=vectorizer.get_feature_names_out()) word_df['标签'] = labels print(word_df.head())
这样你就有了适合ML模型输入的结构化数据啦~
内容的提问来源于stack exchange,提问作者Mooshak
相关产品推荐
相关产品推荐

