前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中使用嵌套for循环读取csv文件出现问题

Python中使用嵌套for循环读取csv文件出现问题

原创
作者头像
华科云商小徐
发布2024-05-08 10:56:33
830
发布2024-05-08 10:56:33
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫

如果我们在使用嵌套循环来读取 CSV 文件时遇到了问题,可以提供一些代码示例和出现的具体错误,这样我可以更好地帮助大家解决问题。不过,现在我可以给大家一个基本的示例,演示如何使用嵌套循环来读取 CSV 文件。

问题背景

我需要读取两个csv文件,合并行,并将结果写入第三个csv文件。第一个csv文件有五列,第一列是用户名。(总共25列) 第二个csv文件有五列,第一列是用户名,第二列是用户ID。(只有2列) 第三个csv文件将包含用户名+用户ID和第一个文件的其余24列。

我使用以下代码来读取csv文件:

代码语言:javascript
复制
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()对象。

代码语言:javascript
复制
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()来重置文件指针的位置。

代码语言:javascript
复制
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语句来打开文件,这样可以确保在使用完文件后关闭文件。

代码语言:javascript
复制
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 文件中包含特殊字符或不规则的数据格式,可能需要进行更复杂的处理。

如果各位遇到了特定的错误或问题,请提供更多细节,这样我就可以帮助大家更好地解决。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档