使用非ascii字符从csv文件中删除null

时间:2018-09-26 16:14:11

标签: python csv non-ascii-characters

我有一个csv文件,其中包含null。该文件还具有非ASCII字符。我想要一个能够处理这类文件的功能
到目前为止,我尝试了几种方法,但是没有一种有效 拳头我尝试replace('\0', '')适用于带ascii的文件,但不适用于cp1254
其次,我尝试了unicodecsv模块,但是它给了我Error: line contains NULL byte
第三次尝试,创建itr = (line.replace('\0') for line in fileObj),然后将生成器传递给unicodecsv,但是由于unicodecsv中的self.reader.next()试图从生成器中获取元素,但它仍然引发异常。

对我来说,像死锁之类的问题我需要解决第一个问题就可以处理第二个问题,但是要解决第一个问题就必须解决第二个问题。不知道如何处理这些问题。请帮忙。谢谢

  

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)

1 个答案:

答案 0 :(得分:0)

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