如何将多个无后缀txt文件分别读入独立DataFrame后快速合并?
你好,针对你的需求,这里有一套既灵活又高效的实现方案,尤其针对你关心的速度问题做了重点优化:
实现独立DataFrames存储+高效合并的方案
首先不建议手动创建df1、df2这类硬编码的变量名——文件数量多的时候会非常繁琐,扩展性极差。推荐用字典存储单个文件的DataFrame,既方便管理,又能轻松实现后续合并。
第一步:批量生成独立的DataFrames
我们可以遍历所有目标文件,把每个文件对应的DataFrame存入字典,键可以用序号(比如df1、df2)或者文件名(你的文件名是时间戳,用它当键更直观,方便后续排查单个文件的数据):
import glob import pandas as pd import numpy as np # 配置读取参数(和你当前的设置保持一致) file_paths = glob.glob("path_in_dir") col_names = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H') dtype_spec = {col: np.float32 for col in col_names} # 简化写法,和你原代码效果一致 # 用字典存储每个独立的DataFrame individual_dfs = {} for idx, file_path in enumerate(file_paths, start=1): # 方式1:用序号作为键,比如 df1、df2... individual_dfs[f'df{idx}'] = pd.read_table( file_path, delim_whitespace=True, names=col_names, dtype=dtype_spec ) # 方式2:用文件名作为键(更直观,因为文件名是时间戳) # individual_dfs[file_path] = pd.read_table(...)
现在你可以通过individual_dfs['df1']或者individual_dfs['具体文件名']随时访问单个文件的DataFrame了。
第二步:最优最快的合并方式
你当前用循环append的方式效率极低——因为每次append都会创建一个新的DataFrame,循环次数越多,产生的临时对象越多,内存和时间开销都很大。最优方案是使用pd.concat()一次性合并所有DataFrame,这是Pandas官方推荐的批量合并方法,速度会快很多。
代码实现:
# 从字典中取出所有DataFrame,合并成一个大的DataFrame all_data = pd.concat(individual_dfs.values(), ignore_index=True)
额外优化建议(进一步提升速度)
- 按时间排序文件:因为你的文件名是时间戳格式,合并前可以先对文件路径排序,确保最终的
all_data是按时间顺序排列的:
file_paths = sorted(glob.glob("path_in_dir"))
- 并行读取(针对超大量文件场景):如果你的文件数量非常多(比如几百上千个),可以用多进程并行读取文件,进一步缩短读取时间:
from multiprocessing import Pool def read_single_file(file_path): return pd.read_table( file_path, delim_whitespace=True, names=col_names, dtype=dtype_spec ) # 启动多进程池读取所有文件 with Pool() as pool: df_list = pool.map(read_single_file, file_paths) # 合并结果 all_data = pd.concat(df_list, ignore_index=True)
注意:如果文件数量不多,单线程读取已经足够快,没必要用多进程(多进程本身有启动开销)。
- 保持dtype优化:你已经指定了
float32的数据类型,这非常棒——相比默认的float64,内存占用直接减半,能大幅提升大文件的处理速度,继续保持这个设置。
内容的提问来源于stack exchange,提问作者newpyguy
相关产品推荐
相关产品推荐

