python - 使用非 ascii 字符从 csv 文件中删除 null
问题描述
我有一个 csv 文件,其中包含 null 。该文件还具有非 ascii 字符。到目前为止,我想要一个能够处理这种文件的函数,
我尝试了几种方法,但它们都不能正常工作。我尝试replace('\0', '')
它适用于带有 ascii 的文件,但不适用于cp1254
第二次我尝试了 unicodecsv 模块,但它给了我Error: line contains NULL byte
第三次尝试,创建itr = (line.replace('\0') for line in fileObj)
并将生成器传递给 unicodecsv,但它仍然引发异常,因为self.reader.next()
in unicodecsv 尝试从生成器中获取元素但它有编码问题。
对我来说,像死锁这样的问题,我需要解决第一个问题,才能处理第二个问题,但要解决第一个问题,我必须解决第二个问题。不知道如何处理这些问题。请帮忙。谢谢你
UnicodeEncodeError
with open(path, 'r') as f:
itr = (line.replace('\0', '') for line in f)
csv.DictReader(itr)
错误:行包含 NULL 字节
with open(path, 'r') as f:
unicodecsv.DictReader(itr, encoding='cp1254')
UnicodeEncodeError
with io.open(path, 'r', encoding=''cp1254) as f:
itr = (line.replace('\0', '') for line in f)
csv.DictReader(itr)
解决方案
Python 3 解决方案使用一个嵌入的空字符和一个来自 cp1254 的字符进行了测试,该字符在 utf-8 中无效:
import csv
# create test file
lines = ['a,b,c,d,e',
'1,2,"3,000.26",\u00CExx,5',
'6,7\x00,800.08,aaa,10']
with open('test.csv', 'w', encoding='cp1254', newline='') as f:
for line in lines:
f.write(line + '\r\n')
# solution
with open('test.csv', 'r', encoding='cp1254', newline='') as f:
reader = csv.DictReader(line.replace('\0', '') for line in f)
# print rows to show it works
for row in reader:
print(row)
输出
OrderedDict([('a', '1'), ('b', '2'), ('c', '3,000.26'), ('d', 'Ïxx'), ('e', '5')])
OrderedDict([('a', '6'), ('b', '7'), ('c', '800.08'), ('d', 'aaa'), ('e', '10')])
推荐阅读
- c++ - 如何使用尽可能少的数据将数据缓冲区计算为零校验和值
- sql-server - 使用批处理文件中的数据运行 SQL Server 生成脚本
- spring - 如何配置tomcat数据源?
- wso2-am - 在 WSO2 API Manager 3.0.0 中启用有线日志记录
- sql - 雪花中的断言
- go - syscall.Mount 返回无效参数
- r - 使用 R dplyr 将值分配给特定数据框单元格的最简单“整洁”方法
- java - 带有工厂模式的枚举
- asp.net-core-mvc - 将内部 HTML 传递给 ASP.NET Core MVC 3 中的局部视图
- java - 替换特定 URL 参数中的字符