使用循环构造路径读取Parquet文件合并DataFrame报错求助
问题解释与解决方法
错误原因分析
- 直接报错原因:第二个循环中,
i是从Total_df列表取出的字符串文件名(比如'ais_comb_1.parquet'),你执行了i +=1,试图将字符串和整数拼接,这在Python中不被允许,因此抛出TypeError: can only concatenate str (not "int") to str。 - 额外隐藏问题:
- 路径拼接错误:手动拼接
'main_data_1/'+ str(i),既没有结合根路径变量,也未适配Windows系统的反斜杠路径格式,容易导致文件找不到。 - DataFrame合并逻辑错误:
all_ais_msg_df初始是列表,调用all_ais_msg_df.append(df)后转成DataFrame,会导致数据结构混乱,且循环逐次合并效率极低。 - 冗余代码:第一个循环中的
j +=1完全多余,for j in np.arange(1,len(dir_list)+1)已经会自动让j从1递增到len(dir_list),手动加1会跳过部分序号的文件名。
- 路径拼接错误:手动拼接
解决方法与优化代码
修正后的完整代码
import os import pandas as pd import numpy as np # 根路径 path = "C:**********\\main_data_1" dir_list = os.listdir(path) # 构造所有目标文件名 total_df = [] for j in np.arange(1, len(dir_list) + 1): filename = f'ais_comb_{j}.parquet' total_df.append(filename) # 读取并合并所有Parquet文件 all_ais_msg_df = [] for filename in total_df: # 用os.path.join自动适配路径分隔符,避免手动拼接错误 file_path = os.path.join(path, filename) df = pd.read_parquet(file_path) all_ais_msg_df.append(df) # 一次性合并所有DataFrame,效率远高于循环逐次合并 final_df = pd.concat(all_ais_msg_df, ignore_index=True) # 可选:将合并后的结果保存为单个Parquet文件 final_df.to_parquet(os.path.join(path, 'combined_all_ais.parquet'))
关键修正说明
- 移除无效代码:删掉
i +=1和j +=1,循环变量会自动迭代,手动修改只会引发逻辑错误或类型报错。 - 规范路径拼接:使用
os.path.join()替代手动拼接,自动适配Windows/Linux的路径分隔符,避免路径格式错误。 - 优化合并逻辑:先将所有读取的DataFrame存入列表,最后用
pd.concat()一次性合并,既保证数据结构正确,又提升运行效率。 - 简化文件名构造:用f-string(
f'ais_comb_{j}.parquet')替代传统字符串拼接,代码更简洁易读。
更简洁的写法(可选)
如果文件名确实严格遵循ais_comb_1.parquet到ais_comb_N.parquet的规律,可以省略构造文件名的循环,直接生成路径:
import os import pandas as pd path = "C:**********\\main_data_1" file_count = len(os.listdir(path)) # 直接生成所有文件的完整路径 file_paths = [os.path.join(path, f'ais_comb_{j}.parquet') for j in range(1, file_count + 1)] # 读取并合并所有文件 final_df = pd.concat([pd.read_parquet(fp) for fp in file_paths], ignore_index=True) final_df.to_parquet(os.path.join(path, 'combined_all_ais.parquet'))
内容的提问来源于stack exchange,提问作者Jeremiah Aremu
相关产品推荐
相关产品推荐

