使用Python多进程并行读取文件追加数据遇错求助
多进程读取文件共享列表的问题修复
常见错误原因及解决办法
1. AttributeError(触发自a.shape)
这个错误基本是因为读取文件后得到的a不是预期的带shape属性的对象(比如numpy数组)——要么是文件读取失败返回了None,要么是数据格式不符合预期。解决时要在读取函数里加异常捕获和前置检查:
def read_append(file_num, shared_list): filename = f"file_{file_num}.txt" try: # 替换成你实际的文件读取逻辑,比如np.load/pd.read_csv等 a = np.loadtxt(filename) # 先确认a有shape属性再操作 if hasattr(a, "shape"): shared_list.append(a) else: print(f"文件{filename}的数据格式不对,没有shape属性") except Exception as e: print(f"处理文件{filename}出错: {str(e)}")
2. FileNotFoundError
出现这个问题的常见场景:
- 文件名生成错误:比如你的文件是
file_1.txt到file_10.txt,但代码生成了超出范围的编号(比如file_11),导致找不到文件。先核对编号范围和实际文件名是否匹配。 - 子进程工作目录不匹配:如果文件不在当前脚本的工作目录,子进程可能找不到文件。解决办法是传递绝对路径给子进程:
import os # 主进程里生成文件绝对路径 file_paths = [os.path.abspath(f"file_{num}.txt") for num in range(10)] # 子进程直接用绝对路径读取 def read_append(file_path, shared_list): try: a = np.loadtxt(file_path) shared_list.append(a) except ...: # 异常处理代码 pass
3. 多进程共享列表的正确使用
必须在if __name__ == "__main__":块内启动进程(避免Windows下的多进程启动问题),同时正确传递共享列表对象。完整可运行示例:
import multiprocessing as mp import numpy as np import os def read_append(file_path, shared_list): try: a = np.loadtxt(file_path) shared_list.append(a) except AttributeError: print(f"文件{file_path}读取的数据无shape属性") except FileNotFoundError: print(f"找不到文件: {file_path}") except Exception as e: print(f"处理文件{file_path}出错: {str(e)}") if __name__ == "__main__": # 替换成你实际的文件编号范围 file_nums = range(5) file_paths = [os.path.abspath(f"file_{num}.txt") for num in file_nums] with mp.Manager() as manager: res = manager.list() processes = [] # 创建并启动子进程 for path in file_paths: p = mp.Process(target=read_append, args=(path, res)) processes.append(p) p.start() # 等待所有子进程完成 for p in processes: p.join() # 输出结果 print(f"成功读取{len(res)}个文件的数据") for idx, data in enumerate(res): print(f"第{idx+1}个数据的shape: {data.shape}")
内容的提问来源于stack exchange,提问作者jcp
相关产品推荐
相关产品推荐

