队
我想按照下面的代码做的两件事
1)将file1的第2,3,4和8列中的数据写入新文件 2)第1列中的数据(复制在新文件中)应搜索file2。如果找到,则选择文件2的同一行的第3列中的数据,并将其写入新文件的新列。
第1点工作正常..根据第二点获取输出的问题
import csv
f1 = csv.reader(open("C:/Users/file1.csv","rb"))
f2 = csv.writer(open("C:/Users/newfile.csv","wb"))
f3 = csv.reader(open("C:/Users/file2.csv","rb"))
for row in f1:
if not row[0].startswith("-"):
f2.writerow((row[1],row[2],row[3],row[7]))
var1 = row[1]
for row in f3:
if var1 in row:
f2.append(row[2])
答案 0 :(得分:1)
您的代码存在以下问题:
f1
中的每一行,您(可能)迭代f3
中的所有行。这会降低您的表现。f3
中的所有行,就会在文件的末尾,下次迭代不会返回任何行。这是我的建议(未经测试):
# Create lookup from f3
lookup = {}
with open('C:/Users/file2.csv', newline='') as f3:
csv_f3 = csv.reader(f3)
for row in csv_f3:
lookup[row[1]] = row[2]
# Process the rows in f1
with open('C:/Users/file1.csv', newline='') as f1:
with open('C:/Users/newfile.csv', 'w', newline='') as f2:
csv_f1 = csv.reader(f1)
csv_f2 = csv.writer(f2)
for row in csv_f1:
if not row[0].startswith("-"):
try:
csv_f2.writerow(row[1],row[2],row[3],row[7],lookup[row[1]])
except KeyError:
csv_f2.writerow(row[1],row[2],row[3],row[7])
答案 1 :(得分:0)
我怀疑你重新使用" row"第二个for循环中的变量名称正在破坏" var1"中的变量名称。我总是避免在嵌套循环中清除那种变量名称的回收。
for row_f1 in f1:
if not row_f1[0].startswith("-"):
temp_list = [row_f1[1],row_f1[2],row_f1[3],row_f1[7]]
for row_f3 in f3:
if temp_list[0] in row_f3:
temp_list.append(row_f3[2])
f2.writerow(temp_list]
然而,据我所知,我不知道那个追加会做你需要的,因为f2没有附加方法。从你使用.append开始,看起来你想把f1中的元素放到列表中
QQuickItem
虽然你对你想要达到的目标的解释对我来说并不完全清楚。
编辑:我认为Kristof的解决方案要好得多,我只是试图找到一种解决方案,只需要对现有代码进行微小的更改。如果您提供了一个示例,表明您希望输出与给定输入相符,那肯定会澄清事情。答案 2 :(得分:0)
@Andrew,我根据你的输入更改了我的代码。但是row_f1 [1]的第一行中的值仅转到第二行for循环。这意味着row_f1 [1]的值在其他行中没有考虑进行第二次循环。
for row_f1 in f1:
if not row_f1[0].startswith("-"):
temp_list = [row_f1[1],row_f1[2],row_f1[3],row_f1[7]]
for row_f3 in f3:
if temp_list[0] in row_f3:
temp_list.append(row_f3[2])
f2.writerow(temp_list)