You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:13:09