【问题标题】:Python: How to iterate every third row starting with the second row of a csv filePython:如何从 csv 文件的第二行开始每隔三行迭代一次
【发布时间】:2019-12-27 06:34:37
【问题描述】:

我正在尝试编写一个程序,逐行遍历 csv 文件的长度。它将创建 3 个新的 csv 文件并将源 csv 文件中的数据写入每个文件。程序对 csv 文件的整个行长度执行此操作。

对于第一个 if 语句,我希望它从第一行开始每隔三行复制一次并将其保存到一个新的 csv 文件中(它复制的下一行将是第 4 行、第 7 行、第 10 行等)

对于第二个 if 语句,我希望它从第二行开始每隔三行复制一次并将其保存到一个新的 csv 文件中(它复制的下一行将是第 5 行、第 8 行、第 11 行等)。

对于第三个 if 语句,我希望它从第三行开始每隔三行复制一次并将其保存到一个新的 csv 文件中(它复制的下一行将是第 6 行、第 9 行、第 12 行等)。

我编写的创建第一个“agentList1.csv”的第二个“if”语句完全按照我想要的方式工作,但我不知道如何让第一个“elif”语句从第二行开始第二个“elif”语句从第三行开始。任何帮助将不胜感激!

这是我的代码:

for index, row in Sourcedataframe.iterrows(): #going through each row line by line

#this for loop counts the amount of times it has gone through the csv file. If it has gone through it more than three times, it resets the counter back to 1.
for column in Sourcedataframe: 
    if count > 3:
        count = 1

        #if program is on it's first count, it opens the 'Sourcedataframe', reads/writes every third row to a new csv file named 'agentList1.csv'.
    if count == 1:
        with open('blankAgentList.csv') as infile: 

          with open('agentList1.csv', 'w') as outfile:
            reader = csv.DictReader(infile)
            writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames)
            writer.writeheader()
            for row in reader:
                count2 += 1
                if not count2 % 3:
                    writer.writerow(row)

    elif count == 2:
        with open('blankAgentList.csv') as infile:

          with open('agentList2.csv', 'w') as outfile:
            reader = csv.DictReader(infile)
            writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames)
            writer.writeheader()
            for row in reader:
                count2 += 1
                if not count2 % 3:
                    writer.writerow(row)

    elif count == 3:
        with open('blankAgentList.csv') as infile:

          with open('agentList3.csv', 'w') as outfile:
            reader = csv.DictReader(infile)
            writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames)
            writer.writeheader()
            for row in reader:
                count2 += 1
                if not count2 % 3:
                    writer.writerow(row)

    count = count + 1 #counts how many times it has ran through the main for loop. 

【问题讨论】:

  • 你在哪里初始化count?似乎这会引发错误。
  • 为什么要一遍又一遍地打开相同的文件,而不是一次性打开?
  • 这些是 CSV 文件有关系吗?您只是想重新分配文本文件的行吗?
  • iterrows 真的很慢,如果您发布输入和预期输出数据帧,可能会有不同的解决方案,解释逻辑
  • 你为什么在这里使用熊猫?

标签: python excel pandas csv


【解决方案1】:

将 csv 转换为数据帧为 (df.to_csv(header=True)) 以从第二行开始索引

然后,通过iloc 函数中的行/记录号来获取特定记录使用 ( df.iloc[ 3 , : ])

【讨论】:

    【解决方案2】:

    您从一开始就在每个 if 子句中打开您的 csv 文件。我相信您已经将文件打开到Sourcedataframe。所以只需摆脱reader = csv.DictReader(infile) 并像这样读取数据:

    Sourcedataframe.iloc[column]

    【讨论】:

      【解决方案3】:

      使用纯 python,我们可以创建一个适用于任意数量的交错数据行的解决方案,我们称之为 NUM_ROWS,而不仅仅是三个。

      注意事项:该解决方案不需要读取整个输入并将所有数据保存在内存中。它一次处理一行,将最后需要的几行分组,并且适用于非常大的输入文件。

      假设您的输入文件包含多个数据行,这些数据行是 NUM_ROWS 的倍数,即可以将行平均拆分到输出文件:

      NUM_ROWS = 3
      outfiles = [open(f'blankAgentList{i}.csv', 'w') for i in range(1,NUM_ROWS+1)]
      
      with open('blankAgentList.csv') as infile:
          header = infile.readline() # read/skip the header
      
          for f in outfiles: # repeat header in all output files if needed
              f.write(header)
      
          row_groups = zip(*[iter(infile)]*NUM_ROWS)
          for rg in row_groups:
              for f, r in zip(outfiles, rg):
                  f.write(r)
      
      for f in outfiles:
          f.close()
      

      否则,我们可以使用任意数量的数据行

      import itertools as it
      
      NUM_ROWS = 3
      outfiles = [open(f'blankAgentList{i}.csv', 'w') for i in range(1,NUM_ROWS+1)]
      
      with open('blankAgentList.csv') as infile:
          header = infile.readline() # read/skip the header
      
          for f in outfiles: # repeat header in all output files if needed
              f.write(header)
      
          row_groups = it.zip_longest(*[iter(infile)]*NUM_ROWS)
          for rg in row_groups:
              for f, r in it.zip_longest(outfiles, rg):
                  if r is None:
                      break
                  f.write(r)
      
      for f in outfiles:
          f.close()
      

      例如,输入文件为

      A,B,C
      r1a,r1b,r1c
      r2a,r2a,r2c
      r3a,r3b,r3c
      r4a,r4b,r4c
      r5a,r5b,r5c
      r6a,r6b,r6c
      r7a,r7b,r7c
      

      产生(直接从终端复制的输出)

      (base) SO $ cat blankAgentList.csv 
      A,B,C
      r1a,r1b,r1c
      r2a,r2a,r2c
      r3a,r3b,r3c
      r4a,r4b,r4c
      r5a,r5b,r5c
      r6a,r6b,r6c
      r7a,r7b,r7c
      
      (base) SO $ cat blankAgentList1.csv 
      A,B,C
      r1a,r1b,r1c
      r4a,r4b,r4c
      r7a,r7b,r7c
      
      (base) SO $ cat blankAgentList2.csv 
      A,B,C
      r2a,r2a,r2c
      r5a,r5b,r5c
      
      (base) SO $ cat blankAgentList3.csv 
      A,B,C
      r3a,r3b,r3c
      r6a,r6b,r6c
      

      注意:我理解这条线

      row_groups = zip(*[iter(infile)]*NUM_ROWS)
      

      一开始可能有点吓人(我刚开始的时候就是这样)。

      它所做的只是将输入文件中的连续行分组。

      如果您的目标包括学习 Python,我建议您通过一本书或一门课程或两者兼而有之地深入学习它并进行大量练习。

      一个关键主题是迭代协议以及所有其他协议。和命名空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 2019-06-18
        • 1970-01-01
        相关资源
        最近更新 更多