Bash for循环无法写入文件:为何无法逐次为foo.csv追加列?
Bash循环覆盖文件问题分析与Python实现方案
问题原因解析
你用的Bash循环之所以丢失原foo.csv内容、仅保留最后一个文件的第5列,核心原因是Bash重定向的执行顺序:
执行paste foo.csv <(cut -f 5 $skra) > foo.csv时,Bash会优先处理输出重定向> foo.csv——这一步会直接清空foo.csv文件,再执行前面的paste命令。此时paste读取的已是被清空后的foo.csv,所以每次循环后,foo.csv只会保留当前txt文件提取出的第5列,循环结束后自然只剩最后一个文件的结果,原内容完全丢失。
补充背景:所有涉及的文件均为制表符分隔,初始foo.csv仅包含一列数据。
实现需求的Python脚本
以下是能实现“给初始文件逐次添加各txt文件第5列”需求的Python脚本(含中文注释):
import pandas as pd # 存储每个文件提取的列数据 column_list = [] # 读取window.list中的文件名列表 with open('window.list') as f: for line in f: # 去除文件名前后的空白字符(如换行符) file_name = line.strip() # 读取制表符分隔的文件,仅取第5列(索引为4,pandas从0开始计数),以文件名作为列名 df = pd.read_csv(file_name, header=None, names=[file_name], sep='\t', usecols=[4]) column_list.append(df) # 将所有提取的列横向拼接 result_frame = pd.concat(column_list, axis=1) # 保存结果为制表符分隔文件,不生成自动索引列 result_frame.to_csv('rammi.allra', sep='\t', encoding='utf-8', index=False)
内容的提问来源于stack exchange,提问作者AWE
相关产品推荐
相关产品推荐

