【问题标题】:Iterating over CSV file to match items in another list遍历 CSV 文件以匹配另一个列表中的项目
【发布时间】:2019-08-14 23:31:03
【问题描述】:

我正在尝试自动归档一些扫描的文档。这些由需要与作业名称匹配的对象编号标识。

我有一个文件夹中提取的文件名列表和一个包含大约 50,000 条对象编号和作业编号记录的 CSV 文件。
我可以通过== obj_num[0] 等获得所选工作编号的正确匹配,但我不知道如何遍历列表。

import glob,os,csv

items = glob.glob('*.pdf')
obj_num = [".".join(f.split(".")[:-1]) for f in items if os.path.isfile(f)]

job_id = []


with open('locations.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    field_names = ['jobid', 'ItemUniqueId', '###anotherfield', '###anotherfield2']
    for row in csv_reader:
            if row['ItemUniqueId'] == obj_num:
                job_id = row['jobid']
    print(job_id)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    基本上,您构建了一个查找dict,您可以使用它根据关联的ItemID(来自文件名)直接查找JobID。因此,您遍历 CSV 文件一次,然后构建查找:

    lookup = {}
    with open('locations.csv', 'r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        field_names = ['jobid', 'ItemUniqueId', '###anotherfield', '###anotherfield2']
        for row in csv_reader:
            lookup[row['ItemUniqueId']] = row['jobid']
    

    然后,对于每个文件名,您使用 ItemID 作为关键字搜索 JobID

    job_id = lookup.get(item_id) # returns None if not found
    job_id = lookup[item_id]     # raises as KeyError if not found
    

    您还可以使用以下方法检查 ItemID 是否存在于查找中:

    if item_id in lookup:
        # something something something
    

    另外,您可能想看看pathlib,它是一个内置模块,为您提供对文件系统的高级访问。如果我正确阅读了您的代码,则您正在尝试从文件名中删除扩展名,Path.stem() 为您执行此操作,例如:

    from pathlib import Path
    
    for pdf_file in Path('your path here').glob('*.pdf'):
        file_name_wo_suffix = pdf_file.stem
        job_id = lookup.get(file_name_wo_suffix)
    

    【讨论】:

    • 感谢您的帮助!我已经尝试了上述方法,但无法正常工作。我在返回行(“返回”外部函数“)上遇到错误,但我会想一想,然后回来。我的最终目标是将 job_id 编号附加到目录,然后将相关的 PDF 移至该文件夹。
    • 抱歉,return 不应该存在。我修改了帖子以将其删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多