You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:45:48