[英]How to read csv data, strip spaces/tabs and write to new csv file?
我有一个很大的(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:这是非剥离正确的结果。 其中一些具有未剥离的前导空格,一些具有未剥离的尾随空格。 似乎最左边的列已被适当地除去前导空格,但没有除去尾随空格; 与标题行相同。
更新:这是我正在寻找的解决方案:
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)
不要让自己变得复杂,“ 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中的所有条目(而不仅仅是行)。 如果是这样,那么根据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')
它的作用是用逗号将每一行分割成一个值列表,然后从空格中剥离每个元素,然后再将它们备份起来并保存到输出文件中。
您的最终阅读器变量包含字典元组,但您的作家需要列表。
您可以使用csv.DictWriter或先将处理后的数据(v)存储在列表中,然后使用writer.writeheader()写入csv并包含标头
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.