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(',')
对我的文件无效,以防有人试图在答案中使用它。
答案 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))