如何使用Python脚本

时间:2016-08-10 10:25:19

标签: python python-2.7

我想按照下面的代码做的两件事

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])

3 个答案:

答案 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)