1

我的任务是将一个 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)
4

0 回答 0