嵌套for循环的问题

fra*_*ois 2 python

我必须读取两个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
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

为什么在i = 2之后seconf for循环什么都不做?我希望i = 2,j = 0到6,i = 3 j = 0 ro 6,...

Fai*_*sal 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
Run Code Online (Sandbox Code Playgroud)

变化:

  • 我删除了创建StringIO对象的无关步骤; 你可以将标准文件句柄传递给csv.reader(),它会正常工作.(如果有创建这些StringIO对象的原因,请随意将其添加回...)
  • 我已经将读取器的初始化移到了for循环之外.虽然在外部循环中初始化source1是正常的,但是在内部循环中初始化source2是非常低效的.
  • 最重要的是,调用data2.seek(0)会将光标重置为基础文件句柄,这将允许您重复读取data2.

这是关于SO的类似问题,可能更好地说明了这个想法:

StackOverflow:重复读​​取Python中的CSV?

希望能帮助到你.:)