Python批量处理多文件夹大网格排放TXT文件,按经纬度筛选
批量处理大体积网格化排放文件的高效解决方案
问题分析
你的代码报错是因为subset不是pandas或Python的内置函数,且原代码存在两个核心问题:
- 仅创建了空DataFrame,未将读取的文件内容导入
- 直接用
read()读取超百万行文件会导致内存过载,效率极低
高效实现代码
以下代码实现批量遍历目标文件夹下所有子目录的网格化排放.txt,分块读取大文件以避免内存溢出,按指定经纬度筛选后保存结果:
import pandas as pd import os # 配置参数 ROOT_DIR = r"替换为你的目标根文件夹路径" OUTPUT_PATH = r"筛选后的排放数据.txt" # 经纬度筛选范围 LAT_BOUNDS = (28, 33) LON_BOUNDS = (75, 97) # 初始化存储最终结果的DataFrame filtered_data = pd.DataFrame(columns=['lat', 'lon', 'emission']) # 遍历所有子目录查找目标文件 for root, _, files in os.walk(ROOT_DIR): for filename in files: if filename == "网格化排放.txt": file_full_path = os.path.join(root, filename) print(f"Processing: {file_full_path}") # 分块读取大文件,chunksize可根据内存调整 for chunk in pd.read_csv( file_full_path, sep="\t", # 根据实际文件分隔符修改(如逗号、空格) names=['lat', 'lon', 'emission'], # 匹配你的数据列名 chunksize=10000 ): # 布尔索引筛选,注意加括号避免运算符优先级错误 mask = ( (chunk['lat'] >= LAT_BOUNDS[0]) & (chunk['lat'] <= LAT_BOUNDS[1]) & (chunk['lon'] >= LON_BOUNDS[0]) & (chunk['lon'] <= LON_BOUNDS[1]) ) filtered_chunk = chunk[mask] filtered_data = pd.concat([filtered_data, filtered_chunk], ignore_index=True) # 保存结果为txt文件 filtered_data.to_csv(OUTPUT_PATH, sep="\t", index=False) print(f"Done. Results saved to: {OUTPUT_PATH}")
核心优化说明
- 分块读取:通过
chunksize将大文件拆分为小块处理,避免一次性加载全部数据导致内存耗尽 - 布尔索引:使用pandas原生的布尔索引替代不存在的
subset函数,正确实现数据筛选 - 批量遍历:
os.walk自动遍历所有子目录,无需手动指定每个文件路径 - 内存控制:仅保留符合条件的数据块,减少不必要的内存占用
注意事项
- 务必根据你的文件实际分隔符修改
sep参数(如文件用逗号分隔则改为sep=",") - 若需为每个原文件单独保存筛选结果,可将
filtered_data的合并逻辑改为每个块处理后直接追加到对应输出文件 chunksize可根据电脑内存调整:内存充足可设为50000,内存有限则设为5000-10000
内容的提问来源于stack exchange,提问作者Stay Raw
相关产品推荐
相关产品推荐

