【问题标题】:How to read csv data, strip spaces/tabs and write to new csv file?如何读取 csv 数据、去除空格/制表符并写入新的 csv 文件?
【发布时间】:2019-12-15 01:29:45
【问题描述】:

我有一个大型(160 万行以上).csv 文件,其中包含一些带有前导空格、制表符和尾随空格甚至可能是尾随制表符的数据。我需要读取数据,去除所有空白,然后将行吐出到一个新的 .csv 文件中,最好使用最有效的代码,并且只使用 python 3.7 中的内置模块

这是我目前正在工作的内容,除了它只会一遍又一遍地吐出标题并且似乎没有处理尾随标签(虽然在尾随标签上并不是什么大问题):

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)

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

...
    # 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:这是不正确剥离的结果。其中一些具有未删除的前导空格,有些具有未删除的尾随空格。似乎最左边的列被正确地去除了前导空格,但没有去除尾随空格;与标题行相同。

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)

【问题讨论】:

  • 一定要用python,还是可以用更快更高效的,比如awk或者sed
  • 我可以使用其他东西,但我正在尝试自动执行此操作,因为它必须每月一次又一次地完成,并且我需要在清理后对数据进行一些计算它
  • 使用sed查看我的解决方案更新答案。
  • 问题是我在必须完成这项工作的计算机上没有管理员权限......这需要这样的访问权限吗?我没有使用 shell 的经验

标签: python csv read-write


【解决方案1】:

不要让自己的生活变得复杂,“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)

【讨论】:

  • 这行得通,但它并没有从所有内容中去除空白
  • 你能给出一个没有被正确剥离的示例行或文件吗? str.strip() 去除字符串两端的空格、制表符和换行符。
  • 鉴于数据的性质,我无法在线发布它,但我做了一个模型,并确保只用随机乱码替换字母/数字并重新运行代码。希望我可以发布实际的 .csv 输出,但我会附加原始帖子...给我一分钟然后刷新
  • 哦,我明白了,你想去掉每个字段的空格。抱歉,我会发布一个新的解决方案。
  • 请检查新解决方案的答案。
【解决方案2】:

很遗憾,我无法发表评论,但我相信您可能希望删除 csv 中的每个条目的空白(不仅仅是行)。如果是这种情况,那么根据 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')

它的作用是用逗号分割每一行,生成一个值列表,然后从空格中删除每个元素,以便稍后将它们连接起来并保存到输出文件。

【讨论】:

    【解决方案3】:

    您的最终 reader 变量包含 dicts 元组,但您的 writer 需要列表。

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

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2022-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多