【发布时间】:2013-12-14 02:03:45
【问题描述】:
我想比较两个 csv 文件中的列并提取匹配的值,如下所示:
file1.csv 是
115.06603, 5.9
114.74721, 5.4
114.85107, 6.2
111.17744, 5.5
192.77787, 3.2
189.70226, 5
0.46762, 3.7
2.21539, 3.5
2.96667, 3.6
而file2.csv是
115.06603
115.06603
114.74721
114.74721
114.74721
114.74721
114.85107
114.85107
114.85107
114.85107
114.85107
111.17744
111.17744
输出文件 file3.csv 应该是
115.06603, 5.9
115.06603, 5.9
114.74721, 5.4
114.74721, 5.4
114.74721, 5.4
114.74721, 5.4
114.85107, 6.2
114.85107, 6.2
114.85107, 6.2
114.85107, 6.2
114.85107, 6.2
111.17744, 5.5
111.17744, 5.5
我使用了以下代码,但输出文件只给出第一列而不是两列。你能帮我解决这个问题吗?
>>> with open("file1.csv", "rb") as in_file1, open("file2.csv", "rb") as in_file2, open("file3.csv", "wb") as out_file:
... reader1 = csv.reader(in_file1)
... reader2 = csv.reader(in_file2)
... writer = csv.writer(out_file)
... for row2 in reader2:
... for row1 in reader1:
... if row2[0] == row1[0]:
... row2[1] = row1[1]
... writer.writerow(row2)
编辑 我使用了你的代码,但第一部分给出了以下错误:
data1 = {}
with open("file1.csv", "rb") as in_file1:
... reader1 = csv.reader(in_file1)
... for row1 in reader1:
... data1[row1[0]] = row1[1]
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
IndexError: list index out of range
因为 file1.csv 中的分隔符是 ;不是,我加了 delimiter=';'如下
data1 = {}
with open("file1.csv", "rb") as in_file1:
... reader1 = csv.reader(in_file1, delimiter=';')
... for row1 in reader1:
... data1[row1[0]] = row1[1]
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
IndexError: list index out of range
和你看到的一样的错误
我添加了 in.file.seek(0) 如下
data1 = {}
with open("file1.csv", "rb") as in_file1:
... reader1 = csv.reader(in_file1)
... for row1 in reader1:
... in_file1.seek(0)
... data1[row1[0]] = row1[1]
...
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
IndexError: list index out of range
同样的错误。问题是什么?我好郁闷。
编辑
我用来删除空行的代码
with open("file2.csv", "r") as in_file2, open("out.csv", "w") as out_file:
... reader2 = csv.reader(in_file2)
... writer = csv.writer(out_file)
... for row in reader2:
... if any(field.strip() for field in row):
... writer.writerow(row)
【问题讨论】:
-
编辑下的第一个块对我来说适用于没有空行的逗号分隔文件。所以:1.你为什么使用“b”模式来读取文件,2.你的输入文件中有空行,如果有,你需要把它们去掉(或者如果 row1 的长度为 0,则忽略它们)跨度>
-
我将 file1.csv 中的分隔符从 ; ,并且它正在工作。但是这段代码也没有与 file2.csv 匹配。可能是什么问题呢?您之前是否使用过此代码并工作过?
-
如果您回答我在上一条评论中提出的问题,我可能会为您提供更好的帮助。
-
1-我从代码中省略了b,因为不需要使用“b”模式。 2-是的,我在 file1.csv 中有空行,但我忽略了它们。
-
您是否尝试在遍历第一个文件时放置一个打印语句以查看实际存储到 data1 中的内容?你忽略空行的代码是什么?