无法在Python的多处理中将两个列表合并到映射中

时间:2019-03-16 22:12:25

标签: python python-3.x python-multiprocessing

我有一个带有SKU和URL的csv,我可以将它们分为两个列表

def myskus():
    myskus =[]
    with open('websupplies2.csv', 'r') as csvf:
        reader = csv.reader(csvf, delimiter=";")
        for row in reader:
            myskus.append(row[0]) # Add each skus to list contents
    return myskus


def mycontents():
    contents = []
    with open('websupplies2.csv', 'r') as csvf:
        reader = csv.reader(csvf, delimiter=";")
        for row in reader:
            contents.append(row[1]) # Add each url to list contents
    return contents

然后我对URL进行多处理,但是我想加入对应的SKU

if __name__ == "__main__":

    with Pool(4) as p:
     records = p.map(parse, web_links)

    if len(records) > 0:
         with open('output_websupplies.csv', 'a') as f:
          f.write('\n'.join(records))

我可以放吗     记录= p.map(解析,skus,web_links)

因为不起作用

我想要的输出格式 会是

sku    price    availability
bkk11  10,00    available

我该如何实现?

1 个答案:

答案 0 :(得分:2)

次要重构

我建议命名您的一对函数def get_skus()def get_urls(),以符合您的问题定义。

数据结构

有一对列表skusurls似乎不太适合您的高级问题。 将它们放在一起,作为(skuurl)元组的列表或sku_to_url字典。 也就是说,删除您的两个功能之一,因此您只读取一次CSV,并将相关详细信息保持在一起。 这样,您的parse()例程就会有更多可用信息。 元组列表归结为Monty的starmap()建议。

编写结果

您正在使用此

    if len(records) > 0:
        with open('output_websupplies.csv', 'a') as f:
            f.write('\n'.join(records))

首先,测试至少一个记录可能是多余的,打开附加然后写入零记录并不是世界末日。 如果您关心文件上的时间戳,那么这可能是有用的优化。

更重要的是,write()似乎很糟糕。 有一天,一个不幸的角色可能会潜入您的记录之一。 最好将结构化记录馈送到csv.writer,以确保适当的报价。