我必须读取两个csv文件,合并行并将结果写入第三个csv文件。 第一个csv文件在第一个colunm中有五行带有用户名。(总共25个colunm) 第二个csv文件在第一个colunm中有五行用户名,在第二个colunm中有用户id。(只有2个colunm)
第三个csv文件将包含用户名+ userid以及第一个文件的所有剩余24列。
data = open(os.path.join("c:\\transales","AccountID+ContactID-source1.csv"),"rb").read().replace(";",",").replace("\0","")
data2 = open(os.path.join("c:\\transales","AccountID+ContactID-source2.csv"),"rb").read().replace(";",",").replace("\0","")
i = 0
j = 0
Info_Client_source1=StringIO.StringIO(data)
Info_Client_source2=StringIO.StringIO(data2)
for line in csv.reader(Info_Client_source1):
name= line[1]
i=i+1
print "i= ",i
for line2 in csv.reader(Info_Client_source2):
print "j = :",j
j=j+1
if line[1] == line2[2]:
continue
结果:
i= 1
j = : 0
j = : 1
j = : 2
j = : 3
j = : 4
j = : 5
j = : 6
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
为什么在i = 2之后seconf for循环什么都不做? 我希望i = 2,j = 0到6,i = 3 j = 0 ro 6,...
答案 0 :(得分:6)
这是因为你在第一遍中读取了StringIO对象的全部内容,将光标留在了字符串的末尾。在第二遍,没有什么可以阅读,所以你最终得到一个空读者。
此外,为循环的每个内部迭代调用csv.reader()可能不是一个好主意。让我重新编写代码,然后解释我的更改:
data = open(os.path.join("c:\\transales","AccountID+ContactID-source1.csv"),"rb").read().replace(";",",").replace("\0","")
data2 = open(os.path.join("c:\\transales","AccountID+ContactID-source2.csv"),"rb").read().replace(";",",").replace("\0","")
source1 = csv.reader(data)
source2 = csv.reader(data2)
for line in source1:
name= line[1]
i=i+1
print "i= ",i
data2.seek(0)
for line2 in source2:
print "j = :",j
j=j+1
if line[1] == line2[2]:
continue
的变化:
这是关于SO的类似问题,可能更好地说明了这个想法:
StackOverflow: Reading from CSVs in Python repeatedly?
希望它有所帮助。 :)
答案 1 :(得分:1)
因为一旦csv.reader到达文件的末尾,它将永远不再执行。
对于像这样的小型数据集,您可以轻松地将数据读入列表或字典中并对其进行迭代。
答案 2 :(得分:1)
更多pythonic将是:
filename1 = os.path.join('c:\\transales', 'AccountID+ContactID-source1.csv')
filename2 = os.path.join('c:\\transales', 'AccountID+ContactID-source2.csv')
with open(filename1, 'rb') as file1, open(filename2, 'rb') as file2:
csv1 = csv.reader(file1, delimiter=';')
csv2 = csv.reader(file2, delimiter=';')
lookup = { line[0] : line[1:] for line in csv1 }
joined = [ [uname, uid] + lookup[uname] for (uname, uid) in csv2 ]
print joined
BTW:第一列的索引为0,而不是1。
答案 3 :(得分:0)
这可能是一个简单的修复...尝试将Info_Client_source2
的声明移动到第一个循环中:
Info_Client_source1=StringIO.StringIO(data)
for line in csv.reader(Info_Client_source1):
Info_Client_source2=StringIO.StringIO(data2)
name= line[1]
i=i+1
print "i= ",i
for line2 in csv.reader(Info_Client_source2):
print "j = :",j
j=j+1
if line[1] == line2[2]:
continue