如果我们在使用嵌套循环来读取 CSV 文件时遇到了问题,可以提供一些代码示例和出现的具体错误,这样我可以更好地帮助大家解决问题。不过,现在我可以给大家一个基本的示例,演示如何使用嵌套循环来读取 CSV 文件。
问题背景
我需要读取两个csv文件,合并行,并将结果写入第三个csv文件。第一个csv文件有五列,第一列是用户名。(总共25列)
第二个csv文件有五列,第一列是用户名,第二列是用户ID。(只有2列)
第三个csv文件将包含用户名+用户ID和第一个文件的其余24列。
我使用以下代码来读取csv文件:
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 = 0j = 0Info_Client_source1=StringIO.StringIO(data)Info_Client_source2=StringIO.StringIO(data2)for line in csv.reader(Info_Client_source1):name= line[1]i=i+1print "i= ",ifor line2 in csv.reader(Info_Client_source2):print "j = :",jj=j+1if line[1] == line2[2]:continue
问题是,第二个for循环在第一次循环后就不执行了。我希望它能执行完第二个csv文件的所有行。
解决方案
有三种方法可以解决这个问题。
方法一:
将csv.reader()的调用放在for循环之外,这样可以确保每次循环时都有一个新的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+1print "i= ",idata2.seek(0)for line2 in source2:print "j = :",jj=j+1if line[1] == line2[2]:continue
方法二:
使用Python的内置函数seek()来重置文件指针的位置。
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+1print "i= ",iInfo_Client_source2.seek(0)for line2 in csv.reader(Info_Client_source2):print "j = :",jj=j+1if line[1] == line2[2]:continue
方法三:
使用Python的with语句来打开文件,这样可以确保在使用完文件后关闭文件。
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
需要注意的是,这只是一个简单的示例,假设每一行数据都是均匀的,并且不包含引号等特殊字符。如果大家的 CSV 文件中包含特殊字符或不规则的数据格式,可能需要进行更复杂的处理。
如果各位遇到了特定的错误或问题,请提供更多细节,这样我就可以帮助大家更好地解决。