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

如何用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
解决方案

问题分析

原代码存在以下问题:

  1. df_round_robin.assign(new_column='0')未重新赋值,assign返回新DataFrame,原对象不会被修改;
  2. 遍历队列时直接给整个new_column列赋值,导致所有行数据被覆盖为同一个值;
  3. 没有按轮询逻辑分配数据,而是直接覆盖;
  4. 文件路径拼写错误(fileloaction),且用+拼接路径易出错;
  5. quit()会在处理第一个文件后直接退出,无法处理多个文件;
  6. 读取文本行时未去除换行符,导致数据带多余的\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)

代码说明

  1. 使用copy()避免修改原DataFrame,初始化new_column为列表类型,方便动态追加数据;
  2. 用os.path.join拼接路径,避免不同系统的路径分隔符问题;
  3. 读取文本时过滤空白行并去除换行符,保证数据干净;
  4. 通过idx % cli实现轮询分配,第n行文本对应CSV的n%cli行;
  5. 最后将列表转为逗号分隔的字符串,匹配预期输出格式;
  6. 移除错误的quit(),可处理目录下所有文本文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:45:32