You need to enable JavaScript to run this app. Python遍历文本提取文件名与表头时,如何正确批量追加多个条目?
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历文本提取文件名与表头时,如何正确批量追加多个条目?

报错根因

pd.DataFrame.append() 已在pandas 2.0版本正式移除,且该方法在所有历史版本中仅支持接收Series、DataFrame类型作为入参,无法直接传入字符串、原生列表类型对象,这就是触发TypeError: cannot concatenate object of type '<class 'str'>'的核心原因。
另外原代码的存储逻辑在处理3700个文件的批量任务时存在严重效率缺陷:在循环中反复对DataFrame执行append操作,会触发全量数据的反复内存拷贝,形成O(n²)的时间复杂度,即使修正类型匹配问题,也会运行极慢。

修正后的可直接运行实现

实现逻辑完全匹配要求的输出格式,同时针对批量任务做了容错、效率优化:

import glob
import os

# 可直接修改的配置项
TARGET_TXT_PATH = r"C:\Users\ryans\OneDrive\Desktop\test\*.txt"
HEADER_READ_LINES = 2  # 需提取的前2行表头
OUTPUT_SUMMARY_PATH = r"C:\Users\ryans\OneDrive\Desktop\extracted_file_schemas.txt"

# 用原生列表做暂存,批量任务的内存/时间效率远高于循环操作DataFrame
temp_storage = []
all_files = glob.glob(TARGET_TXT_PATH)

for full_path in all_files:
    # 提取不带全路径的纯文件名,匹配样例输出格式
    pure_name = os.path.basename(full_path)
    # 加编码容错,避免单个文件的特殊字符导致整个流程中断
    try:
        with open(full_path, 'r', encoding='utf-8', errors='ignore') as f:
            # 逐行读取前2行,去掉末尾换行符
            header_content = [next(f).rstrip('\n') for _ in range(HEADER_READ_LINES)]
    except StopIteration:
        # 跳过行数不足2行的残缺文件,不中断批量任务
        continue
    # 把单文件的内容按输出顺序存入暂存区
    temp_storage.append(pure_name)
    temp_storage.extend(header_content)

# 按照要求的格式导出汇总结果
with open(OUTPUT_SUMMARY_PATH, 'w', encoding='utf-8') as f_out:
    f_out.write('\n'.join(temp_storage))

实现关键特性

  • 格式匹配:通过os.path.basename()提取纯文件名,输出内容和你给出的样例格式完全一致,不会把文件的完整存储路径写入结果
  • 流程容错:加入encoding='utf-8', errors='ignore'参数,兼容Windows下常见的混合编码文本文件,避免单个文件的特殊字符导致全流程中断
  • 异常兜底:捕获StopIteration异常,自动跳过行数不足2行的残缺文件,不会因为少量坏文件中断3700个文件的批量遍历
  • 效率优化:所有数据暂存用原生Python列表完成,仅在全部文件读取完成后做一次格式转换,避免循环中的频繁内存拷贝,即使处理上万个文件也能在数秒内完成
可选结构化存储方案(适配后续生成数据库表结构的需求)

如果需要把提取的内容拆成结构化字段(方便后续自动拼接数据库建表语句),不需要在循环中反复操作DataFrame,可以在全部文件遍历完成后一次性生成DataFrame,效率最高:

import pandas as pd
import glob
import os

TARGET_TXT_PATH = r"C:\Users\ryans\OneDrive\Desktop\test\*.txt"
temp_storage = []
all_files = glob.glob(TARGET_TXT_PATH)

for full_path in all_files:
    pure_name = os.path.basename(full_path)
    try:
        with open(full_path, 'r', encoding='utf-8', errors='ignore') as f:
            header_line1 = next(f).rstrip('\n')
            header_line2 = next(f).rstrip('\n')
    except StopIteration:
        continue
    temp_storage.append({
        "file_name": pure_name,
        "schema_field_line": header_line1,
        "schema_description_line": header_line2
    })

# 所有文件遍历完成后,仅做一次内存拷贝生成DataFrame
results = pd.DataFrame(temp_storage)

运行效果

修正后的代码导出的文本格式将完全匹配样例:

FFIEC CDR Call Schedule RICI 09302019.txt
IDRSSD  RCFDM708    RCFDM709    RCFDM710
    RE CNSTR LN RECD INVST:INDV IMPARMNT    RE CNSTR LN ALLW BAL: INDV IMPAIRMNT    RE CNSTR LN RECD INVST:COLL IMPARMNT
FFIEC CDR Call Schedule RICI 09302020.txt
IDRSSD  RCFDM708    RCFDM709    RCFDM710
    RE CNSTR LN RECD INVST:INDV IMPARMNT    RE CNSTR LN ALLW BAL: INDV IMPAIRMNT    RE CNSTR LN RECD INVST:COLL IMPARMNT

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 02:54:02