尝试迭代csv文件时出现无提示错误(python)

时间:2015-12-17 02:06:04

标签: python csv iterator

我尝试制作一些脚本来使用源csv文件,将其与另一个文件进行比较,并使用第一个文件替换第二个文件中具有相同第一列的行。

我正在使用该代码:

#!/usr/bin/env python2
import csv
import sys
f = open(sys.argv[1], 'rt')
t = open(sys.argv[2], 'wt')
r = open(sys.argv[2], 'rt')
try:
    patch = csv.reader(f)
    panorama = csv.reader(r)
    target = csv.writer(t)
#   row2 = 0
    for row in patch:
#       print row[0]
        for row2 in panorama:
            print row
            print row[0], row2[0]
            if row[0] == row2[0]:
                target.writerow((row[0], row[1],row[2],row[3],row[4],row[5],row[6],row[7],row[8]))
finally:
    f.close()
    t.close()
    r.close()

不幸的是,这失败没有任何错误,但我的调试打印不打印任何东西。第一个评论的打印正常工作,并打印我的第一个文件的第一列。

请你帮我找一下这个有什么问题?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您无法同时以只读和只写方式打开同一文件。

  

7.2。读写文件   open()返回一个文件对象,最常用的有两个参数:open(filename,mode)。   当文件只能被读取时,模式可以是'r','w'只能写入(具有相同名称的现有文件将被删除)。

Python 2.7.11 documentation

中的

当你声明target = csv.writer(t)时,t使得t = open(sys.argv [2],'wt'),你覆盖用sys.argv [2]指向的文件,因此,当你尝试读取panorama = csv.reader(r),r = open(sys.argv [2],'rt')时,你没有什么可比的。

答案 1 :(得分:0)

不要同时使用read和write打开同一个文件 - 因为一旦发出write,内容就会消失。 创建另一个要写入的文件。

答案 2 :(得分:0)

您的方法存在两个问题。第一个是打开相同的文件进行读/写(可以在HistB等模块的帮助下完成,但由于没有csv支持,它会很乱。第二个问题是你有嵌套for循环。在fileinput的第一行之后,您已经用尽了patch文件。你需要的是两个非嵌套循环。这是我的方法:

panorama

在我的解决方案中,import csv import sys if __name__ == '__main__': with open(sys.argv[1], 'rt') as patch_file, \ open(sys.argv[2], 'rt') as pano_file, \ open(sys.argv[3], 'wt') as output_file: patch_lookup = {row[0]: row for row in csv.reader(patch_file)} pano = csv.reader(pano_file) output = csv.writer(output_file) for row in pano: row = patch_lookup.get(row[0], row) output.writerow(row) 是一个字典,其中键是第一个字段,值是整行。在阅读patch_lookup时,以下行将查找修补程序中的行并替换它(如果适用):

pano

查找后,我们会将行写入输出。