Удалить ноль из CSV-файла с не-ASCII char - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть CSV-файл содержит ноль.Файл также имеет не ascii символ.Я хочу иметь функцию, позволяющую обрабатывать этот тип файла
, пока я пробовал несколько способов, но ни один из них не работает Frist.Я попытался replace('\0', ''), это работает для файла с ascii, но не для cp1254
Во-вторых, я попробовал модуль unicodecsv, но он дает мне Error: line contains NULL byte
Третья попытка, создать itr = (line.replace('\0') for line in fileObj) и передать генератор в unicodecsv, но это все еще вызывает исключение, поскольку self.reader.next() в 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)

1 Ответ

0 голосов
/ 26 сентября 2018

Решение 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')])
...