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

Python遍历文本文件提取前N行并附加文件名的代码问题排查

问题修复与优化代码

原代码问题分析

  1. 仅保留最后一个文件数据:每次循环都用pd.concat([df, fname], axis=1)生成新的DataFrame并覆盖df_headers,而非将每个文件的处理结果追加到总表中。
  2. 制表符数据未拆分:直接将整行字符串存入DataFrame,未按制表符分割字段。
  3. 文件名未重复填充:生成的文件名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:42:55