首页 > 解决方案 > 打开带有 NUL 字节的 CSV

问题描述

背景

操作系统:Red Hat linux,Python 版本:3.6

我有几千个文件需要每周加载到 HDFS 中以提供一些 Impala 表。一些字段有间隙逗号,如下所示:

"ingredient","amount"
"CORN, GROUND",1

这些字段被引用,但 Impala 忽略了这一点,并将那些间隙逗号作为字段分隔符读取。我正在尝试使用 Python 来删除它们。从源系统(可能是 SQL Server,但我不确定)导出时,字段中的 NULL 会导出为 NUL 字节,如下所示:

NUL 字节在 2021 年左右令人不寒而栗,彩色

问题

当代码运行到具有 NUL 字节的文件时,它会引发错误。我认为errors='ignore'应该防止读者被空字节窒息,我还尝试使用 Python 的内置 chardet 提前检测编码并正确打开文件。没有骰子——尽管事实证明某些文件确实有不同的编码,但尝试定制open()似乎不起作用。

代码

## This is in a separate utility module from the script below  
  def hasInFieldDelimiters(self,file_obj_to_parse,quote_char='"',field_delimiter=',',delimiter_to_find=','):
    print("Finding commas in file {}".format(file_obj_to_parse))
    row_reader = csv.reader(file_obj_to_parse, delimiter=field_delimiter, quotechar=quote_char)
    for row in row_reader:
      for field in row:
        if delimiter_to_find in field:
          print("In-field comma found")
          return True
    print("No commas found")
    return False
## This is the script I run.  The method above is called three lines below as "util.hasInFieldDelimiters()"
for file in os.listdir(file_path):
  encoding = util.getEncoding(file_path,file)
  with open(file_path+file,'r+',newline='',encoding=encoding,errors='ignore') as file_obj_to_parse:
    has_in_field_delimiters = util.hasInFieldDelimiters(file_obj_to_parse)
  if has_in_field_delimiters==True:
    to_write = []
    with open(file_path+file,'r+',newline='',encoding=encoding,errors='ignore') as file_obj_to_parse:
      reader = csv.reader(file_obj_to_parse,delimiter=',',quotechar='"')
      for row in reader:
        for field in row:
          field = field.replace(',','')
        to_write += row
    with open(file_path+file,'w',encoding='latin-1') as replacement:
      writer = csv.writer(replacement)
      writer.writerows(to_write)

我还尝试了什么?

我尝试了几种不同的方式来调用 open() 和 csv.reader()。我无法安装“编解码器”或“xlrd”(共享远程系统)之类的新模块,而不得不使用内置的 CSV。

Python CSV 错误:行包含 NULL 字节

数据中包含 NUL 字节的 CSV 文件的 python Dictread

文件未打开超过 NUL 字节

Python - 查找 unicode/ascii 问题

标签: python-3.xcsv

解决方案


推荐阅读