【问题标题】:Python read CSV file, and write to another skipping columnsPython读取CSV文件,并写入另一个跳过列
【发布时间】:2016-10-08 02:46:38
【问题描述】:

我有 18 列的 CSV 输入文件 我需要使用输入中除第 4 列和第 5 列之外的所有列创建新的 CSV 文件

我的函数现在看起来像

def modify_csv_report(input_csv, output_csv):
    begin = 0
    end = 3

    with open(input_csv, "r") as file_in:
        with open(output_csv, "w") as file_out:
            writer = csv.writer(file_out)
            for row in csv.reader(file_in):
                writer.writerow(row[begin:end])
    return output_csv

所以它读取和写入第 0 - 3 列,但我不知道如何跳过第 4,5 列并从那里继续

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您可以使用 slicing 添加行的另一部分,就像您对第一部分所做的那样:

    writer.writerow(row[:4] + row[6:])
    

    请注意,要包含第 3 列,第一个切片的停止索引应为 4。通常也不需要指定起始索引 0。

    更通用的方法是使用 列表理解enumerate:

    exclude = (4, 5)
    writer.writerow([r for i, r in enumerate(row) if i not in exclude])
    

    【讨论】:

      【解决方案2】:

      如果您的 CSV 具有有意义的标题,则按索引对行进行切片的替代解决方案是使用 DictReaderDictWriter 类。

      #!/usr/bin/env python
      from csv import DictReader, DictWriter
      
      data = '''A,B,C
      1,2,3
      4,5,6
      6,7,8'''
      
      reader = DictReader(data.split('\n'))
      
      # You'll need your fieldnames first in a list to ensure order
      fieldnames = ['A', 'C']
      # We'll also use a set for efficient lookup
      fieldnames_set = set(fieldnames)
      
      with open('outfile.csv', 'w') as outfile:
          writer = DictWriter(outfile, fieldnames)
          writer.writeheader()
          for row in reader:
              # Use a dictionary comprehension to iterate over the key, value pairs
              # discarding those pairs whose key is not in the set
              filtered_row = dict(
                  (k, v) for k, v in row.iteritems() if k in fieldnames_set
              )
              writer.writerow(filtered_row)
      

      【讨论】:

        【解决方案3】:

        这就是你想要的:

        import csv
        
        
        def remove_csv_columns(input_csv, output_csv, exclude_column_indices):
            with open(input_csv) as file_in, open(output_csv, 'w') as file_out:
                reader = csv.reader(file_in)
                writer = csv.writer(file_out)
                writer.writerows(
                    [col for idx, col in enumerate(row)
                     if idx not in exclude_column_indices]
                    for row in reader)
        
        remove_csv_columns('in.csv', 'out.csv', (3, 4))
        

        【讨论】:

          猜你喜欢
          • 2019-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-30
          • 1970-01-01
          • 2017-05-17
          • 1970-01-01
          • 2017-01-09
          相关资源
          最近更新 更多