如果我们在使用嵌套循环来读取 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 = 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
问题是,第二个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+1
print "i= ",i
data2.seek(0)
for line2 in source2:
print "j = :",j
j=j+1
if 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+1
print "i= ",i
Info_Client_source2.seek(0)
for line2 in csv.reader(Info_Client_source2):
print "j = :",j
j=j+1
if 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 文件中包含特殊字符或不规则的数据格式,可能需要进行更复杂的处理。
如果各位遇到了特定的错误或问题,请提供更多细节,这样我就可以帮助大家更好地解决。