【问题标题】:Cannot combine two lists into a map in multiprocessing in Python无法在 Python 中的多处理中将两个列表组合成一个映射
【发布时间】:2019-03-16 22:12:25
【问题描述】:

我有一个包含 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

然后我多处理我的网址,但我想加入相应的 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(parse, skus, web_links)

因为不工作

我想要的输出格式 会是

sku    price    availability
bkk11  10,00    available

我怎样才能做到这一点?

【问题讨论】:

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


【解决方案1】:

小重构

我建议您将这对函数命名为 def get_skus()def get_urls(),以匹配您的问题定义。

数据结构

有一对列表,skusurls,似乎不太适合您的高级问题。 将它们放在一起,作为 (sku, url) 元组的列表,或作为 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,以确保正确引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多