如何读取 csv 数据,剥离 spaces/tabs 并写入新的 csv 文件?

How to read csv data, strip spaces/tabs and write to new csv file?

我有一个大型(超过 160 万行).csv 文件,其中包含一些带有前导空格、制表符和尾随空格甚至可能是尾随制表符的数据。我需要读入数据,去除所有空白,然后将行吐回一个新的 .csv 文件中,最好使用尽可能高效的代码,并且仅使用 python 3.7 中的 built-in 模块

这是我目前正在使用的东西,除了它只会一遍又一遍地吐出 header 并且似乎没有处理尾随制表符(虽然尾随不是什么大不了的事选项卡):

def new_stripper(self, input_filename: str, output_filename: str):
    """
    new_stripper(self, filename: str):
    :param self: no idea what this does
    :param filename: name of file to be stripped, must have .csv at end of file
    :return: for now, it doesn't return anything...


    -still doesn't remove trailing tabs?? But it can remove trailing spaces
    -removes leading tabs and spaces
    -still needs to write to new .csv file
    """
    import csv
    csv.register_dialect('strip', skipinitialspace=True)
    reader = csv.DictReader(open(input_filename), dialect='strip')
    reader = (dict((k, v.strip()) for k, v in row.items() if v) for row in reader)
    for row in reader:
        with open(output_filename, 'w', newline='') as out_file:
            writer = csv.writer(out_file, delimiter=',')
            writer.writerow(row)


input_filename = 'testFile.csv'
output_filename = 'output_testFile.csv'
new_stripper(self='', input_filename=input_filename, output_filename=output_filename)

如上所述,代码只是在一行中一遍又一遍地打印 header。我玩过 def 的最后四行的排列和缩进,得到了一些不同的结果,但我得到的最接近的结果是让它每次都在新行上一次又一次地打印 header 行:

...
    # headers and headers for days
    with open(output_filename, 'w', newline='') as out_file:
        writer = csv.writer(out_file, delimiter=',')
        for row in reader:
            writer.writerow(row)

EDIT1:这是 non-stripping 正确的结果。其中一些具有未剥离的前导空格,一些具有未剥离的尾随空格。 left-most 列似乎被正确地去除了前导空格,但没有去除尾随空格;与 header 行相同。

enter image description here

更新:这是我一直在寻找的解决方案:

def get_data(self, input_filename: str, output_filename: str):
    import csv
    with open(input_filename, 'r', newline='') as in_file, open(output_filename, 'w', newline='') as out_file:
        r = csv.reader(in_file, delimiter=',')
        w = csv.writer(out_file, delimiter=',')
        for line in r:
            trim = (field.strip() for field in line)
            w.writerow(trim)


input_filename = 'testFile.csv'
output_filename = 'output_testFile.csv'

get_data(self='', input_filename=input_filename, output_filename=output_filename)

您的最终 reader 变量包含字典元组,但您的作者需要列表。

您可以先使用 csv.DictWriter 或将处理后的数据 (v) 存储在列表中,然后写入 csv 并使用 writer.writeheader()[=10= 包含 headers ]

不要让自己的生活变得复杂,"CSV"文件是简单的纯文本文件,可以用通用的方式处理:

with open('input.csv', 'r') as inf, open('output.csv', 'w') as of:
    for line in inf:
        trim = (field.strip() for field in line.split(','))
        of.write(','.join(trim)+'\n')

或者,使用 csv 模块:

import csv

with open('input.csv', 'r') as inf, open('output.csv', 'w') as of:

    r = csv.reader(inf, delimiter=',')
    w = csv.writer(of, delimiter=',')

    for line in r:
        trim = (field.strip() for field in line)
        w.writerow(trim)

不幸的是,我无法发表评论,但我相信您可能想要删除 csv 中白色 space 的每个条目(不仅仅是行)。如果是这样,那么根据 Jan 的回答,这可能会成功:

with open('file.csv', 'r') as inf, open('output.csv', 'w') as of:
    for line in inf:
        of.write(','.join(list(map(str.strip, line.split(',')))) + '\n')

它的作用是用逗号分隔每一行,得到一个值列表,然后从白色中剥离每个元素space,稍后将它们连接起来并保存到输出文件。