我的任务是将一个 CSV 文件从 UTF8 编码转换为 ANSI 编码并对其进行格式化。我了解到ANSI在某种意义上确实是系统的编码,但这不是目前的问题。
在转换之前,我必须能够先读取我的 CSV 文件。该文件包含空值,并且标题与文件的其余部分不同。每当我尝试阅读它时,我总是会收到有关 NULL 值或标题的错误。标题在某种意义上是不同的,它们根本没有任何引号,但文件的其余部分在字符串的每一侧都有 3 个引号(并且由于某种原因也围绕 NUL 值)。文件列以逗号分隔,每行以新行结束。
当我尝试使用QUOTE_NONNUMERIC
(以摆脱空值)读取时,出现错误:
batch_data = list(reader)
ValueError: could not convert string to float: 'my_first_column_name'
当我尝试使用QUOTE_ALL
(希望也引用标题)时,出现错误:
batch_data = list(reader)
_csv.Error: line contains NULL byte
这是我的代码:
import csv
file_in = r'<file_in>'
with open(file_in, mode='r') as infile:
reader = csv.reader(infile, quoting=csv.QUOTE_NONNUMERIC)
batch_data = list(reader)
for row in batch_data:
print(row, end="")
在阅读了一些材料之后,我想我必须将标题与文件的其余部分分开阅读。一个人将如何做到这一点?我试图用 跳过它们reader.next()
,但后来我收到错误,这next
不是reader
. 在这一点上,我真的不敢相信我已经花了这么多时间阅读文档并尝试不同的事情。
解决方案
我最终使用 list(next()) 跳过标题,然后用空字符串替换所有空值。然后使用我需要的配置打开输出文件并在其中写入我的行。我仍然需要处理不同的格式,因为这个解决方案在每个单元格周围都加上了双引号,我需要一些是数字。这也将所有单引号从卖出替换为双引号,这仍然需要修复。file_in
并且file_out
变量已经为它们分配了输入文件和输出文件的位置。
import csv
import json
file_in = r'<input_filepath>'
file_out = r'<output_filepath>'
with open(file_in, mode='r', encoding='utf-8-sig') as infile:
reader = csv.reader(infile, quoting=csv.QUOTE_ALL)
header_data = list(next(reader))
infile = infile.read().replace('\0', '').splitlines()
reader2 = csv.reader(infile)
with open(file_out,'w',newline='', encoding='cp1252') as outfile:
writer = csv.writer(outfile, delimiter=';', quoting=csv.QUOTE_NONNUMERIC)
writer.writerow(header_data)
for row in reader2:
row = str(row).replace('"','').replace("'",'"')
row = json.loads(row)
writer.writerow(row)