两个文件的循环只打印第一行python

时间:2015-02-02 06:03:47

标签: python file loops line

  • 第一个文件f1有两列,第一列是ID number,第二列是value associated
  • 第二个文件f2是第一个文件的较大版本,其中包含更多值six columns,但包含第一个文件中的两个。
  • 第二个文件有一列我要与第一个文件中的值相关联,我希望输出为包含text file的新ID
  • 关联的值和另一列与我想要从较大的第二个文件关联的列。
  • 到目前为止,我已经制作了一个符合我想要的代码,但它只打印出第一行。
  • 我在python中并不是很棒,这在我的代码中可能很明显,我希望有人能解决我的问题

    import csv    
    with open('output1.txt','w') as out1,open('list1.csv') as f1,open('list2.csv') as f2:  
    csvf1=csv.reader(f1)
    csvf2=csv.reader(f2)
    for txt1 in csvf1:
        id1=txt1[0]
        z1=txt1[1]
    
        for txt2 in csvf2:
            id2=txt2[0]
            z2=txt2[3]
            ra=txt2[1]
            if id1==id2:
               out1.write("{} {} {}\n".format(id2,z1,ra))
    
    out1.close()
    f1.close()
    f2.close()
    
  • 我还想指出,出于某种原因,使用.split(',')对我的文件无效,以防有人试图在答案中使用它。

3 个答案:

答案 0 :(得分:0)

将行csvf2 = csv.reader(f2)保留在第一个循环中。内循环将仅针对第一行执行。对于第二行,内部循环不会被执行,因为文件读取器标记已经在文件的末尾。

import csv    
with open('output1.txt','w') as out1,open('list1.csv') as f1,open('list2.csv') as f2:  
    csvf1=csv.reader(f1)

    for txt1 in csvf1:
        id1=txt1[0]
        z1=txt1[1]
        csvf2=csv.reader(f2)
        for txt2 in csvf2:
            id2=txt2[0]
            z2=txt2[3]
            ra=txt2[1]
            if id1==id2:
               out1.write("{} {} {}\n".format(id2,z1,ra))

out1.close()
f1.close()
f2.close()

答案 1 :(得分:0)

cvs.reader()是一个函数,你只能迭代它的结果一次,(它是一个yield函数吗?有人应该纠正我,我只是挖掘进入源代码并陷入对象reader() buildin-module 。无论如何,它只是表现为yield函数)

因此,您可能需要保存临时数组中的每一行以便进一步使用:

 list1 = []
 with open('list1.txt') as fp:
     for row in csv.reader(fp):
          list1.append(row)

顺便说一下,当你用fp表达式打开它时,你不需要显式关闭with,当你离开with范围时,这个机制就是这样做的

答案 2 :(得分:0)

我设法从另一位程序员那里找到了我的答案,这就是最终工作的代码。

非常感谢你的答案,因为他们的工作很接近。

import csv 
with open('output1.txt','w') as out1, open('file1.csv') as f1:
     csvf1=csv.reader(f1)

     for txt1 in csvf1:
           id1=txt1[0]
           z1=txt1[1]

           with open('file2.csv') as f2: 
               csvf2=csv.reader(f2)
               for txt2 in csvf2:
                   id2=txt2[0]
                   z2=txt2[3]
                   ra=txt2[1]
                   if id1 == id2:
                       out1.write("{} {} {}\n".format(id2,z1,ra))