Python遍历文本文件提取前N行并附加文件名的代码问题排查
问题修复与优化代码
原代码问题分析
- 仅保留最后一个文件数据:每次循环都用
pd.concat([df, fname], axis=1)生成新的DataFrame并覆盖df_headers,而非将每个文件的处理结果追加到总表中。 - 制表符数据未拆分:直接将整行字符串存入DataFrame,未按制表符分割字段。
- 文件名未重复填充:生成的文件名DataFrame只有1行,无法与N行数据匹配。
修正后的代码
import pandas as pd import os import glob # 配置参数 path = 'C:\\Users\\ryans\\Desktop\\all_files\\' N = 5 # 要提取的前N行 output_path = 'C:\\Users\\ryans\\Desktop\\out.csv' # 获取所有txt文件路径 txt_files = glob.glob(os.path.join(path, "*.txt")) # 初始化总DataFrame df_headers = pd.DataFrame() for f in txt_files: # 获取纯文件名(不含路径) file_name = os.path.basename(f) # 读取文件前N行,按制表符拆分字段 # 处理文件行数不足N的情况,自动取全部行 df = pd.read_csv(f, sep='\t', header=None, nrows=N) # 添加文件名列,重复填充N行(或文件实际行数) df['文件名'] = file_name # 将当前文件数据追加到总表 df_headers = pd.concat([df_headers, df], ignore_index=True) # 导出结果到CSV df_headers.to_csv(output_path, index=False, encoding='utf-8-sig')
关键优化点说明
- 追加数据:用
pd.concat([df_headers, df], ignore_index=True)将每个文件的处理结果纵向追加,保留所有文件数据。 - 拆分制表符数据:使用
pd.read_csv指定sep='\t',自动将每行按制表符拆分为多列,无需手动处理字符串。 - 文件名填充:通过
df['文件名'] = file_name自动将文件名填充到当前文件的所有行,Pandas会自动匹配行数。 - 兼容短文件:
nrows=N会自动读取文件的前N行,如果文件行数不足N则读取全部,避免索引越界。 - 纯文件名:用
os.path.basename(f)获取仅文件名部分,输出结果更整洁。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

