如何用Pandas读取文本文件写入CSV不覆盖,实现轮询式列填充
问题描述
我有若干个包含随机数据的文本文件(每行数据独立,文件行数不固定),需要实现以下读取逻辑:
- 将文本文件的第一行数据存入CSV文件的第一行,第二行存入CSV第二行,以此类推;
- 若CSV的行已用完但文本仍有剩余数据,则用逗号分隔追加到对应行的
new_column列中。
我写了如下函数:
def round(): cli = int(input('no of rows:: ')) df_round_robin = self.path_to_csv.head(cli) df_round_robin.assign(new_column='0') queue = [] fileloaction = "C:\\Users\\pro\\.....*" for filename in os.listdir(filelocation): complete_path = filelocation + filename f = open(complete_path, "r") for i in f: queue.append(i) for i in queue: df_round_robin["new_column"] = i df_round_robin.to_csv(f'{filename}_round.csv') print(df_round_robin) quit()
这个函数能运行,但达不到预期效果:数据总是被覆盖,且所有行的new_column列数据相同。
预期输出
示例1:
当输入cli=2,文本文件有4行数据:
1 2 3 4
处理后的CSV应该是:
row1,row2,row3,new_column 1,2,3,1,3 1,2,3,2,4
(或new_column为列表格式如[1,3]也可)
示例2:
当输入cli=2,文本文件有5行数据:
1 2 3 4 5
处理后的CSV应该是:
row1,row2,row3,new_column 1,2,3,1,3,5 1,2,3,2,4
解决方案
问题分析
原代码存在以下问题:
df_round_robin.assign(new_column='0')未重新赋值,assign返回新DataFrame,原对象不会被修改;- 遍历队列时直接给整个
new_column列赋值,导致所有行数据被覆盖为同一个值; - 没有按轮询逻辑分配数据,而是直接覆盖;
- 文件路径拼写错误(
fileloaction),且用+拼接路径易出错; quit()会在处理第一个文件后直接退出,无法处理多个文件;- 读取文本行时未去除换行符,导致数据带多余的
\n。
修正后的代码
import os import pandas as pd def round_robin_process(): cli = int(input('no of rows:: ')) # 读取CSV的前cli行并创建副本,避免修改原数据 df_round_robin = self.path_to_csv.head(cli).copy() # 初始化new_column为列表,方便后续追加数据 df_round_robin['new_column'] = [[] for _ in range(cli)] file_location = "C:\\Users\\pro\\....." # 移除末尾*,listdir无需通配符 # 遍历目录下所有文件 for filename in os.listdir(file_location): complete_path = os.path.join(file_location, filename) # 跳过非文件项(如文件夹) if not os.path.isfile(complete_path): continue # 读取文件内容,过滤空白行并去除换行符 with open(complete_path, "r", encoding="utf-8") as f: lines = [line.strip() for line in f if line.strip()] # 按轮询逻辑分配每行数据到对应CSV行的new_column for idx, line in enumerate(lines): row_idx = idx % cli df_round_robin['new_column'][row_idx].append(line) # 将列表转为逗号分隔的字符串 df_round_robin['new_column'] = df_round_robin['new_column'].apply(lambda x: ','.join(x)) # 保存结果,可根据需求调整文件名 df_round_robin.to_csv('round_robin_result.csv', index=False) print(df_round_robin)
代码说明
- 使用
copy()避免修改原DataFrame,初始化new_column为列表类型,方便动态追加数据; - 用
os.path.join拼接路径,避免不同系统的路径分隔符问题; - 读取文本时过滤空白行并去除换行符,保证数据干净;
- 通过
idx % cli实现轮询分配,第n行文本对应CSV的n%cli行; - 最后将列表转为逗号分隔的字符串,匹配预期输出格式;
- 移除错误的
quit(),可处理目录下所有文本文件。
内容的提问来源于stack exchange,提问作者Python
相关产品推荐
相关产品推荐

