python-3.x - 打开带有 NUL 字节的 CSV
问题描述
背景
操作系统:Red Hat linux,Python 版本:3.6
我有几千个文件需要每周加载到 HDFS 中以提供一些 Impala 表。一些字段有间隙逗号,如下所示:
"ingredient","amount"
"CORN, GROUND",1
这些字段被引用,但 Impala 忽略了这一点,并将那些间隙逗号作为字段分隔符读取。我正在尝试使用 Python 来删除它们。从源系统(可能是 SQL Server,但我不确定)导出时,字段中的 NULL 会导出为 NUL 字节,如下所示:
问题
当代码运行到具有 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 - random.choices 中的累积权重
- r - 将函数应用于 R 中的向量列表
- eclipse - 在 Eclipse 中将文件或文件夹添加到 Git 存储库
- sql - SQL Server:多行 XML
- c++ - 执行 C++ CUDA 内核时出现黑屏,输出正确结果
- c# - 将多个 tvp 值添加到数据表时出错
- python - 在 Windows 7 上安装 pandas 时未满足 NumPy 依赖项
- python - 使用 datetime64 将字符串转换为 np.array,而不是使用 Pandas
- android - Youtube 的连接状态底部栏
- java - 如何在所有 Android 版本中以编程方式获取当前 CPU 温度?