首页 > 解决方案 > 使用非 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)

标签: pythoncsvnon-ascii-characters

解决方案


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')])

推荐阅读