我尝试制作一些脚本来使用源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()
不幸的是,这失败没有任何错误,但我的调试打印不打印任何东西。第一个评论的打印正常工作,并打印我的第一个文件的第一列。
请你帮我找一下这个有什么问题?
感谢您的帮助!
答案 0 :(得分:0)
您无法同时以只读和只写方式打开同一文件。
Python 2.7.11 documentation 中的7.2。读写文件 open()返回一个文件对象,最常用的有两个参数:open(filename,mode)。 当文件只能被读取时,模式可以是'r','w'只能写入(具有相同名称的现有文件将被删除)。
当你声明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
查找后,我们会将行写入输出。