如何合并多个文本文件?及单列文件转两列与(x,y)绘图实现
嘿,针对你的两个问题,我来分享些实用的解决方案,都是日常处理这类任务时常用的方法:
问题1:如何将多个文本文件合并为一个文本文件
这个需求太常见了,分场景给你几种简单的实现方式:
命令行快速搞定(适合不需要额外处理的情况)
- Linux/macOS 用户:直接用
cat命令就行,比如要把当前目录下所有.txt文件合并到combined.txt:
如果需要按特定顺序合并,直接列出文件名就行:cat *.txt > combined.txtcat file1.txt file2.txt file3.txt > combined.txt - Windows 用户:用命令提示符的
copy命令,合并所有.txt文件:
指定顺序的话,就把文件名用copy *.txt combined.txt+连起来:copy file1.txt+file2.txt+file3.txt combined.txt
脚本方式(灵活可控,适合需要额外处理的情况)
如果需要跳过空行、给每个文件内容加个标识之类的,用Python脚本最方便:
# 可以手动指定要合并的文件列表,或者自动遍历目录 file_list = ["file1.txt", "file2.txt", "file3.txt"] output_file = "combined.txt" with open(output_file, "w", encoding="utf-8") as out_f: for file_name in file_list: with open(file_name, "r", encoding="utf-8") as in_f: # 这里可以加自定义逻辑,比如写入文件名作为分隔 out_f.write(f"--- 来自文件:{file_name} ---\n") out_f.write(in_f.read()) out_f.write("\n") # 每个文件结束后加个空行分隔开
问题2:合并n个单列文件为多列并绘制(x,y)形式的图
从你的示例来看,应该是要把多个单列文件的内容按行对应合并成多列(比如第一个文件是x轴数据,其他是不同的y轴数据),然后选任意两列绘图。分两步来实现:
第一步:合并n个单列文件为多列文件
用Python的pandas库可以轻松搞定,不管是2个还是n个文件都适用:
import pandas as pd # 假设你的文件是data1.txt、data2.txt...datan.txt,放在当前目录 n = 3 # 替换成你实际的文件数量 file_list = [f"data{i}.txt" for i in range(1, n+1)] # 读取每个文件作为一列 df_list = [] for idx, file in enumerate(file_list): # 读取单列数据,给每列起个名字比如col1、col2... df = pd.read_csv(file, header=None, names=[f"col{idx+1}"]) df_list.append(df) # 按行合并所有列(如果文件行数不一样,会自动用NaN补全) combined_df = pd.concat(df_list, axis=1) # 保存为空格分隔的文本文件,也可以换成tab分隔(sep="\t") combined_df.to_csv("combined_columns.txt", sep=" ", index=False, header=True)
要是不想用pandas,用基础Python代码也能实现:
n = 3 # 替换成你的文件数量 file_list = [f"data{i}.txt" for i in range(1, n+1)] lines_collection = [] # 先把每个文件的行读进来 for file in file_list: with open(file, "r") as f: # 跳过空行,只保留有效内容 lines = [line.strip() for line in f if line.strip()] lines_collection.append(lines) # 取行数最少的文件作为基准,避免索引越界 min_line_count = min(len(lines) for lines in lines_collection) with open("combined_columns.txt", "w") as out_f: # 先写表头 out_f.write(" ".join([f"col{i+1}" for i in range(n)]) + "\n") # 逐行合并写入 for i in range(min_line_count): row_data = [lines_collection[j][i] for j in range(n)] out_f.write(" ".join(row_data) + "\n")
第二步:绘制(x,y)形式的图
还是用pandas配合matplotlib来绘图,灵活度很高:
import pandas as pd import matplotlib.pyplot as plt # 读取合并后的多列文件 df = pd.read_csv("combined_columns.txt", sep=" ") # 比如选col1作为x轴,col2作为y轴画散点图 x_axis = "col1" y_axis = "col2" plt.figure(figsize=(8, 6)) plt.scatter(df[x_axis], df[y_axis], label=f"{x_axis} vs {y_axis}", color="blue") # 要是想画折线图,把scatter换成plot就行:plt.plot(df[x_axis], df[y_axis], label=...) plt.xlabel(x_axis) plt.ylabel(y_axis) plt.title(f"{x_axis} vs {y_axis} 分布图") plt.legend() plt.grid(True) plt.savefig("xy_scatter_plot.png") # 保存图片到本地 plt.show() # 弹出窗口显示图片
如果有多个y列,还能一次性画多条曲线:
x_axis = "col1" y_axis_list = ["col2", "col3"] plt.figure(figsize=(8, 6)) for y_axis in y_axis_list: plt.plot(df[x_axis], df[y_axis], label=f"{x_axis} vs {y_axis}") plt.xlabel(x_axis) plt.ylabel("数值") plt.title(f"多系列对比图:{x_axis} vs 各Y系列") plt.legend() plt.grid(True) plt.savefig("multi_series_plot.png") plt.show()
内容的提问来源于stack exchange,提问作者Cashoo
相关产品推荐
相关产品推荐

