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
相关产品推荐
相关产品推荐

