如何读取 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,稍后将它们连接起来并保存到输出文件。
我有一个大型(超过 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,稍后将它们连接起来并保存到输出文件。