如何批量将Pickle文件转CSV并筛选样本量前20的文件
解决你的Pickle转CSV并筛选Top20样本的问题
看起来你的代码在处理Pickle文件和生成CSV的逻辑上有几个关键问题,我帮你梳理并修正,同时完成后续筛选Top20的步骤:
第一步:修复Pickle转CSV的核心逻辑
原代码的主要问题是错误地用文本方式读取Pickle文件,以及对os.scandir返回的DirEntry对象处理不当。Pickle是二进制序列化格式,必须用pickle.load加载。另外,每个Pickle对应单个用户的推文,应该单独生成CSV文件,而不是合并到Excel。
下面是修正后的批量转换代码:
import os import pickle import pandas as pd def convert_pkl_to_csv(input_dir, output_dir): # 创建输出目录(如果不存在) os.makedirs(output_dir, exist_ok=True) # 遍历目录下的所有Pickle文件 for entry in os.scandir(input_dir): if entry.is_file() and entry.name.endswith('.pkl'): try: # 加载Pickle文件(二进制读取) with open(entry.path, 'rb') as f: user_tweets = pickle.load(f) # 将用户推文转换为DataFrame,每行一条推文 # 假设user_tweets是列表,每个元素是单条推文内容;如果是字典结构,需调整字段 df = pd.DataFrame(user_tweets, columns=['tweet_content']) # 生成同名CSV文件路径 csv_filename = os.path.splitext(entry.name)[0] + '.csv' csv_path = os.path.join(output_dir, csv_filename) # 保存CSV df.to_csv(csv_path, index=False, encoding='utf-8') print(f"已转换:{entry.name} -> {csv_filename}") except Exception as e: print(f"处理文件{entry.name}失败:{str(e)}") # 调用函数:输入目录是你的Raw文件夹,输出目录可以自定义 convert_pkl_to_csv("Raw/", "Converted_CSVs/")
注意点:
- 如果你的Pickle文件里存储的不是纯推文内容列表,而是包含更多字段(比如发布时间、点赞数等)的字典列表,只需修改
pd.DataFrame的列名即可,比如:df = pd.DataFrame(user_tweets) # 如果字典的键就是列名,直接传入即可
第二步:筛选样本量最多的前20个CSV文件
转换完成后,我们需要统计每个CSV的行数(即推文数量),然后选出Top20:
def find_top_20_csvs(csv_dir): csv_stats = [] for entry in os.scandir(csv_dir): if entry.is_file() and entry.name.endswith('.csv'): try: # 快速获取CSV行数(跳过表头) with open(entry.path, 'r', encoding='utf-8') as f: row_count = sum(1 for _ in f) - 1 # 减1是去掉表头行 csv_stats.append((entry.name, row_count)) except Exception as e: print(f"统计文件{entry.name}失败:{str(e)}") # 按推文数量降序排序,取前20 csv_stats.sort(key=lambda x: x[1], reverse=True) top_20 = csv_stats[:20] # 打印结果 print("\n样本量Top20的CSV文件:") for idx, (filename, count) in enumerate(top_20, 1): print(f"{idx}. {filename} - {count}条推文") # 可选:将Top20文件复制到单独目录 top_dir = "Top20_Tweets/" os.makedirs(top_dir, exist_ok=True) for filename, _ in top_20: src_path = os.path.join(csv_dir, filename) dst_path = os.path.join(top_dir, filename) pd.read_csv(src_path).to_csv(dst_path, index=False, encoding='utf-8') print(f"\n已将Top20文件复制到{top_dir}") # 调用函数 find_top_20_csvs("Converted_CSVs/")
为什么原代码无法运行?
os.scandir返回的是DirEntry对象,不能直接传入open(),必须用entry.path获取文件路径。- Pickle文件是二进制格式,用
'r'文本模式打开会报错,必须用'rb'二进制模式,并用pickle.load加载。 - 原代码试图将所有用户的推文合并到一个Excel,这不符合你“每个文件对应一个用户CSV”的需求。
内容的提问来源于stack exchange,提问作者junior
相关产品推荐
相关产品推荐

