python открывает текстовый файл с пробелом между каждым символом - PullRequest
17 голосов
/ 02 марта 2009

Всякий раз, когда я пытаюсь открыть файл .csv с помощью команды python fread = open('input.csv', 'r') он всегда открывает файл с пробелами между каждым символом. Я предполагаю, что с текстовым файлом что-то не так, потому что я могу открыть другие текстовые файлы той же командой, и они загружаются правильно Кто-нибудь знает, почему текстовый файл будет загружаться так в Python?

Спасибо.

Обновление

Хорошо, я получил это с помощью поста Джаррета Харди

это код, который я использовал для преобразования файла в ascii

fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)

Спасибо!

Ответы [ 8 ]

17 голосов
/ 02 марта 2009

Пост рекурсивным, вероятно, прав ... содержимое файла, вероятно, закодировано многобайтовой кодировкой. Если это действительно так, вы, вероятно, можете прочитать файл в самом python без необходимости сначала конвертировать его вне python.

Попробуйте что-то вроде:

fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')

Флаг 'b' обеспечивает чтение файла в виде двоичных данных. Вам нужно знать (или угадать) оригинальную кодировку ... в этом примере я использовал utf-16, но YMMV. Это преобразует файл в Unicode. Если у вас действительно есть файл с многобайтовыми символами, я не рекомендую преобразовывать его в ascii, поскольку в результате вы можете потерять много символов.

РЕДАКТИРОВАТЬ: Спасибо за загрузку файла. В начале файла есть два байта, которые указывают, что он действительно использует широкую кодировку. Если вам интересно, откройте файл в шестнадцатеричном редакторе, как некоторые предлагали ... в текстовой версии вы увидите что-то вроде «I.D. |.» (так далее). Точка - дополнительный байт для каждого символа.

Приведенный выше фрагмент кода работает на моем компьютере с этим файлом.

7 голосов
/ 02 марта 2009

Файл закодирован в некоторой кодировке Unicode, но вы читаете его как ascii Попробуйте преобразовать файл в ascii, прежде чем использовать его в python.

1 голос
/ 17 мая 2009

Чтобы прочитать закодированный файл, вы можете просто заменить open на codecs.open.

fread = codecs.open('input.csv', 'r', 'utf-16')
1 голос
/ 02 марта 2009

Не является CSV простым TXT-файлом со значениями, разделенными запятой. Просто попробуйте открыть его в текстовом редакторе, чтобы увидеть, правильно ли сформирован файл.

0 голосов
/ 22 мая 2012

Вот быстрый и простой способ, особенно если python не будет правильно анализировать ввод

sed 's/ \(.\)/\1/g'
0 голосов
/ 02 марта 2009

Открыть файл в двоичном режиме, 'rb'. Проверьте это в HEX-редакторе и проверьте на нулевое заполнение '00'. Откройте файл в чем-то вроде текстового редактора Scintilla, чтобы проверить символы, присутствующие в файле.

0 голосов
/ 02 марта 2009

Хорошо, я получил это с помощью поста Джаррета Харди

это код, который я использовал для преобразования файла в ascii

fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)

Спасибо!

0 голосов
/ 02 марта 2009

Это никогда не происходило со мной, но, как сказал Труппо, с файлом должно быть что-то не так.

Попробуйте открыть файл в Excel / BrOffice Calc и снова сохранить как файл в формате CSV.

Если проблема сохраняется, попробуйте подмножество данных: первые 10 / последние 10 / промежуточные 10 строк файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...