提问人:Happy.Hartman 提问时间:11/17/2023 最后编辑:quswadressHappy.Hartman 更新时间:11/17/2023 访问量:35
Python 从 csv1 读取并引用 csv2 写入 csv3
Python Read from csv1 and reference csv2 to write to csv3
问:
我有两个 csv 文件,csv1 是更改的工作文件,csv2 是静态的,用作参考集。
csv1 - 输入.csv
名字 | 类型 | 所有者 | 地位 | 日期 | 群 |
---|---|---|---|---|---|
香蕉 | 水果 | 乔 | 有货 | 1/1/23 | |
苹果 | 水果 | 吉姆 | 缺货 | 1/2/23 | |
番茄 | 素食 | 鲍勃 | 有货 | 1/3/23 | |
土豆 | 蔬菜 | 汤姆 | 缺货 | 1/4/23 | |
几维鸟 | 水果 | 珍 | 有货 | 1/5/23 | |
鸡 | 肉 | 弗朗西斯 | 缺货 | 1/6/23 | |
牛肉 | 肉 | 琳 达 | 有货 | 1/7/23 |
csv2 - 参考.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.writerow(error) 行的位置。
答:
0赞
Zach Young
11/17/2023
#1
这种工作必须在每个文件的单独传递中完成:首先读取引用文件并存储查找值,然后读取其他 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]
查找字典如下所示:
{
"fruit": "1",
"veggie": "2",
"meat": "3",
}
查找准备就绪后,阅读其他 CSV 并检查每行的“类型”,看看它是否在查找中。我喜欢跳过不符合条件的行,而不是添加嵌套的 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 |
评论
1赞
Happy.Hartman
11/18/2023
谢谢!这更有意义。我甚至尝试将它们从 CSV 切换到 xlsx 文档并在那里进行,但这是有道理的,我无法同时打开它们并传递每个文档。
下一个:未解析的引用“turtle”
评论