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
相关产品推荐
相关产品推荐

