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

Pandas读取多CSV写入最终文件仅保留最后文件数据问题

问题根源

嘿,这个问题其实很直观——你在循环里每次调用d1.to_csv(r'final.csv',index=False)的时候,都是直接覆盖掉已经存在的final.csv文件。因为Pandas的to_csv()默认用的是mode='w'(写入模式),相当于每次都把新数据写到一个空文件里,循环跑完自然就只剩最后一个文件的数据了。

两种解决方案

根据你的文件大小,我给你准备了两种靠谱的解决办法:

方案1:先攒齐所有数据再一次性写入(推荐小文件)

如果你的文件都不大,最省心的方式就是先把每个处理好的DataFrame存到一个列表里,最后合并成一个大表再写入。这样既减少了IO操作,也不会出现覆盖问题:

def get_csv_files(client, bucket):
    csv_files = []
    content = client.list_objects(Bucket=bucket).get('Contents')
    for obj in content:
        key = obj.get('Key')
        if '.csv' in key:
            csv_files.append(key)
    return csv_files

# 先搞个列表存所有处理好的数据表
all_processed_dfs = []

for key in get_csv_files(s3_client, bucket):
    file_body = s3_client.get_object(Bucket=bucket, Key=key).get('Body')
    df = pd.read_csv(io.BytesIO(file_body.read()))
    df.columns = [c.replace(' ', '_') for c in df.columns]
    mask = df.iloc[:, 0] == 'Asset_Id'
    d1 = df[~mask]
    d1.columns = df.loc[mask.idxmax].values
    print(d1)
    # 把当前处理好的表加入列表
    all_processed_dfs.append(d1)

# 把所有表合并成一个大表,ignore_index重置索引避免重复
final_df = pd.concat(all_processed_dfs, ignore_index=True)
# 一次性写入最终文件
final_df.to_csv(r'final.csv', index=False)

方案2:循环时追加写入(适合大文件)

如果你的CSV文件特别大,合并成大表会吃太多内存,那就用追加模式写入。记得要控制表头只在第一次写的时候加,不然每追加一次就多一行表头:

def get_csv_files(client, bucket):
    csv_files = []
    content = client.list_objects(Bucket=bucket).get('Contents')
    for obj in content:
        key = obj.get('Key')
        if '.csv' in key:
            csv_files.append(key)
    return csv_files

# 标记是不是第一次写入,用来控制表头
is_first_write = True

for key in get_csv_files(s3_client, bucket):
    file_body = s3_client.get_object(Bucket=bucket, Key=key).get('Body')
    df = pd.read_csv(io.BytesIO(file_body.read()))
    df.columns = [c.replace(' ', '_') for c in df.columns]
    mask = df.iloc[:, 0] == 'Asset_Id'
    d1 = df[~mask]
    d1.columns = df.loc[mask.idxmax].values
    print(d1)
    
    # 第一次写的时候加表头,之后追加就不加了
    d1.to_csv(r'final.csv', index=False, mode='a', header=is_first_write)
    # 写完第一次就把标记改了
    if is_first_write:
        is_first_write = False
小提醒
  • 要确保所有处理后的d1表结构是一样的哦(列名、列数都得匹配),不然合并或者追加的时候会出现列错位、数据乱掉的情况。
  • 看你示例里的CSV用的是;分隔,要是读取的时候解析有问题,记得在pd.read_csv()里加上sep=';'参数,不然列会读错的。

内容的提问来源于stack exchange,提问作者Aditya Bhati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:17:48