【问题标题】:writing the rows of a csv file to another csv file将 csv 文件的行写入另一个 csv 文件
【发布时间】:2021-02-18 19:47:23
【问题描述】:

我想将一个 csv 文件的行写入另一个 csv 文件。我还想更改每一行的内容,如果该行为空,则它保持为空,如果不是,则省略字符串开头和结尾的任何空格。原始 csv 文件有 1 列和 65422771 行。

我已经编写了以下内容以将原始 csv 文件的行写入新文件:

import csv

csvfile = open('data.csv', 'r')

with open('data 2.csv', "w+") as csv_file1: 
    writer = csv.writer(csv_file1)
    count = 0
    for row in csvfile:
        row = row.replace('"', '')
        count+= 1
        print(count)
        if row.strip() == '':
            writer.writerow('\n')
        else:
            writer.writerow(row)

但是,当创建新的 csv 文件时,显示它有 130845543 行(=计数)!新的 csv 文件的大小也是原始文件大小的 2 倍。如何创建具有完全相同行数但对它们进行了上述更改的新 csv 文件?

【问题讨论】:

  • 一个明显的错误是您的意思是writer.writerow(''),而不是writer.writerow('\n')。删除所有双引号看起来也很奇怪。你应该使用正确的csv.reader,就像你使用csv.writer一样。

标签: python csv


【解决方案1】:

试试这个:

import csv

with open('data.csv', 'r') as file:
    rows = [[row[0].strip()] for row in csv.reader(file)]

with open('data_out.csv', "w", newline = "") as file:
    writer = csv.writer(file)
    writer.writerows(rows)

此外,正如@tripleee 所提到的,您的文件非常大,因此您可能希望分块读取/写入它。你可以使用 pandas。

import pandas as pd

chunksize = 10_000

for chunk in pd.read_csv('data.csv', chunksize = chunksize, header = None):
    chunk[0] = chunk[0].str.strip()
    chunk.to_csv("data_out.csv", mode="a", header = False, index = False)

【讨论】:

  • 为什么只提取每行的第一个字段?
  • 因为问题指出:“原始 csv 文件有一列和 65422771 行。”。所以我正在提取每行中的第一个也是唯一一个单元格..
  • 哦,nvm,抱歉,草率阅读。不过,您可能希望避免将整个文件读入内存。
  • _csv.Error: 字段大于字段限制 (131072)
  • 您的列中的字段有多大?您可以尝试import sys,然后在脚本顶部添加:csv.field_size_limit(sys.maxsize)。 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多