Python Dictread CSV файла с NUL-байтами в данных

У меня есть файл CSV, который имеет NUL байт, встроенный в некоторые данные.

Это дает столбцы ABCD, одно из полей в столбце C будет иметь такие данные, как

цитировать символ "Некоторые данные" NUL "Дополнительные данные" NUL "Конец данных",

Когда я открываю его с помощью LIBRE Office Calc, символы NUL не отображаются на дисплее, и если я сохраню их вручную, они исчезнут. Я вижу символы NUL в vi и могу удалить или заменить их tr или вручную в vi, но я хочу иметь возможность обрабатывать его с помощью программы python автоматически.

Процесс DictReader

для строки in infile: которая генерирует исключение, и исключение, следовательно, выходит за пределы цикла и не вернется назад, чтобы получить следующую строку (или разрешить мне изменить символ NUL на пробел или встроенную запятую и обработать эту строку).

К счастью, данные, похоже, имеют другие недействительности, поэтому я, вероятно, пропустил бы это в любом случае. Тем не менее, вопрос заключается в том, как я могу сказать Python перейти к следующей строке.

1 ответ

Так что это немного уродливо, но, похоже, это работает. Вы можете прочитать строку, как обычно, очистить оскорбительные байты, а затем использовать объект StringIO для передачи его в DictReader. Здесь код, предполагающий, что ваш csv имеет запись заголовка (это должно быть проще, если вы этого не сделаете):

#!/usr/bin/env python

import StringIO
import csv 
import ipdb

fin = open('somefilewithnulls', 'rb')
fout = StringIO.StringIO()
reader = csv.DictReader(fout)

while True:
 # for the first record prep StringIO with the first
 # two lines so DictReader can create header
 line = fin.readline() if fin.tell() else fin.readline() + fin.readline()
 if not len(line):
 break

 # clean the line before passing it to DictReader
 line = line.replace('\x00', '') 

 fout.write(line)
 fout.seek(-len(line), 1)

 rec = reader.next()
 print rec

licensed under cc by-sa 3.0 with attribution.