【发布时间】:2023-03-07 20:40:02
【问题描述】:
这是我的代码:
import csv
import os
for root, subFolders, files in os.walk('/path/to/folder/'):
if 'routes.csv' in files:
with open(os.path.join(root, "R.csv"), "r") as inf, \
open(os.path.join(root, "B.csv"), "a") as output:
reader = csv.DictReader(inf, quotechar='"')
headers = ["R_id"]
writer_B_routes = csv.DictWriter(output, headers,
extrasaction='ignore')
writer_B_routes.writeheader()
for row in reader:
if int(row["R_type"]) == 3:
writer_B_routes.writerow(row)
当我在我的 CSV 文件夹上运行它时,如果
R_id
的值只是数字,那么它输出到
B.csv
很好(即
1234
)。但是,如果
R_id
的值是字母数字(即
A123
),那么我在
B.csv
中得到的输出是
""
。
我尝试将
int(row["R_type"]) == 3
更改为
str()
,认为方言的构建方式存在一些问题,但没有奏效。我不确定这些数据在哪里只传递了一个整数。
更新: 链接到示例数据+脚本: Here
更新 2:
我已经用其他几个样本进行了测试 - 案例似乎是独一无二的,但我无法确定原因。我有另一组包含
R_id
的
005M1
的样本数据,它运行正常。给我这个问题的数据有
R_id
和
E2
和类似的。但现在我知道它不适用于所有字母数字 ID。
-
你试过'if "3" in str(row["R_type")' 吗?
-
这些字母数字 R_id 值是否在 CSV 文件中(更重要的是,在
row
字典中)?如果在 DictWriter 中使用extrasaction='raise'
而不是extrasaction='ignore'
,会发生什么? -
@Jodgod 刚刚试过,同样的问题。
writer_B_routes.writerow(row) is supposed to write the value of
R_id` - 如果它们是字母数字,它似乎会拒绝这些。我还尝试将quotechar='"'
添加到DictWriter
,但没有运气。 -
我会通过调试器运行它以查看
if
上发生了什么以及row
的值是什么(或仅使用打印)。 -
显然您在 routes.csv 的开头有一个特殊字符,它搞砸了列名。当我阅读您的文件时,第一列名称是 '\xef\xbb\xbfroute_id' 而不是 'route_id'。检查 this post