【问题标题】:How to write into a CSV file with Python如何使用 Python 写入 CSV 文件
【发布时间】:2017-06-06 03:57:36
【问题描述】:

背景:

我有一个 CSV (csv_dump) 文件,其中包含来自 MySQL 表的数据。我想将一些满足特定条件的行(row[1] == condition_1 and row[2] == condition_2)复制到一个临时 CSV 文件(csv_temp)中。

代码片段:

f_reader = open(csv_dump, 'r')
f_writer = open(csv_temp, 'w')
temp_file = csv.writer(f_writer)

lines_in_csv = csv.reader(f_reader, delimiter=',', skipinitialspace=False)

for row in lines_in_csv:

    if row[1] == condition_1 and row[2] == condition_2:
        temp_file.writerow(row)

f_reader.close()
f_writer.close()

问题:

如何使用 Python3 将正在读取的行“按原样”复制到临时文件中?

【问题讨论】:

    标签: python-3.x csv export-to-csv


    【解决方案1】:

    test.csv

    data1,data2,data3
    120,80,200
    140,50,210
    170,100,250
    150,70,300
    180,120,280
    

    代码在这里

    import csv
    with open("test.csv", 'r') as incsvfile:
      input_csv = csv.reader(incsvfile, delimiter=',', skipinitialspace=False)
      with open('tempfile.csv', 'w', newline='') as outcsvfile:
        spamwriter = csv.writer(outcsvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
        first_row = next(input_csv)
        spamwriter.writerow(first_row)
        for row in input_csv:
            if int(row[1]) != 80 and int(row[2]) != 300:
              spamwriter.writerow(row)
    

    输出tempfile.csv

    data1,data2,data3
    140,50,210
    170,100,250
    180,120,280
    

    如果你没有标题删除这两行

        first_row = next(input_csv)
        spamwriter.writerow(first_row)
    

    【讨论】:

      【解决方案2】:

      以下 Python 脚本似乎可以完成这项工作...不过,话虽如此,您可能应该使用 MySQL 查询直接完成这项工作,而不是从中间 CSV 文件重新处理。但我想我想这样做一定有充分的理由吗?

      mycsv.csv:

      aa,1,2,5
      bb,2,3,5
      cc,ddd,3,3
      hh,,3,1
      as,hfd,3,3
      

      readwrite.py:

      import csv
      
      with open('mycsv.csv', 'rb') as infile:
          with open('out.csv', 'wb') as outfile:
              inreader = csv.reader(infile, delimiter=',', quotechar='"')
              outwriter = csv.writer(outfile)
              for row in inreader:
                  if row[2]==row[3]:
                      outwriter.writerow(row)
      

      out.csv:

      cc,ddd,3,3
      as,hfd,3,3
      

      再做一些工作,您可以更改“csv.writer”以使用与“csv.reader”相同的分隔符和转义/引号字符。这与从文件中写出原始行并不完全相同,但我认为它实际上会一样快,因为如果我们能够检查特定字段的值,则相关行已经清楚地被解析而没有错误。

      【讨论】:

      • 似乎没有任何简单的方法可以从输入 CSV 文件中输出 raw 行。我想到的唯一想法是继承 Python 的 file 类。我试过了,但这并不是一件容易的事,因为 _csv 模块似乎不会一次读取整行。
      猜你喜欢
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2016-06-25
      • 2015-04-09
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多