Python从csv1读取并引用csv2以写入csv3

am46iovg  于 5个月前  发布在  Python
关注(0)|答案(1)|浏览(47)

我有两个csv文件,csv 1是工作文件的变化,csv 2是静态的,并用作参考集。
csv 1-输入.csv
| 名称|类型|所有者|地位|日期|组|
| --|--|--|--|--|--|
| 香蕉|水果|乔|股票|23年1月1日||
| 苹果|水果|吉姆|缺货|23年1月2日||
| 番茄|素食|鲍勃|股票|23年1月3日||
| 马铃薯|蔬菜|汤姆|缺货|23年1月4日||
| 猕猴桃|水果|简|股票|23年1月5日||
| 鸡|肉|弗朗西斯|缺货|23年1月6日||
| 牛肉|肉|琳达|股票|23年7月1日||
csv 2- reference.csv
| 类型|组|
| --|--|
| 水果| 1 |
| 素食| 2 |
| 肉| 3 |
我在这里找到了这篇文章https://stackoverflow.com/a/14257599,它帮助我开始,但它的处理似乎不起作用
我使用这个代码:

with open("input.csv", "r") as csv_input, open("reference.csv", "r")as assign_csv, open("output.csv", "w") as out_file:
reader = csv.reader(csv_input)
reader2 = csv.reader(assign_csv)
writer = csv.writer(out_file)

for error in reader:
    writer.writerow(error)
    for group in reader2:
        if group[0] in error[1]:
            error[5] = group[1]
            writer.writerow(error)

字符串
这可以读取输入和引用文件,但在if语句的最底部,它没有做任何事情,我不知道为什么。基本上,我希望它循环通过input.csv中的每一行,并检查Type列中的值,然后循环通过reference.csv,如果文本包含在那里,然后写入output. csv中的Group列。
当前代码基本上只是将input.csv复制到output.csv,而没有向Group列的单元格写入任何内容。我知道循环逻辑是正确的,因为我用一个单独的代码示例尝试了它,它工作得很好,所以我认为我的问题是if语句和writer. writerrow(error)行的位置。

hlswsv35

hlswsv351#

这种工作必须在每个文件的单独通道中完成:首先读取引用文件并存储查找值,然后读取其他CSV并使用查找结构。
Python的dict非常适合保存查找键和值:

lookup: dict[str, str] = {}
with open("input1.csv", newline="") as f:
    reader = csv.reader(f)
    next(reader)  # discard header

    for row in reader:
        lookup[row[0]] = row[1]

字符串
lookup dict看起来像:

{
    "fruit": "1",
    "veggie": "2",
    "meat": "3",
}


查找准备就绪后,读取另一个CSV并检查每行的Type以查看它是否在查找中。我喜欢跳过不合格的行,而不是添加嵌套的if语句:

new_rows: list[list[str]] = []
with open("input2.csv", newline="") as f:
    reader = csv.reader(f)
    new_rows.append(next(reader))  # append header

    for row in reader:
        group = lookup.get(row[1])
        if group == None:
            continue

        row[5] = group
        new_rows.append(row)


然后写最后一个文件:

with open("output.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(new_rows)
| Name    | Type   | Owner   | Status       | Date   | Group |
|---------|--------|---------|--------------|--------|-------|
| bananas | fruit  | joe     | In Stock     | 1/1/23 | 1     |
| apples  | fruit  | Jim     | Out Of Stock | 1/2/23 | 1     |
| tomato  | veggie | bob     | In Stock     | 1/3/23 | 2     |
| kiwi    | fruit  | jane    | In Stock     | 1/5/23 | 1     |
| chicken | meat   | francis | Out Of Stock | 1/6/23 | 3     |
| beef    | meat   | linda   | In Stock     | 1/7/23 | 3     |

相关问题