python открывает текстовый файл с пробелом между каждым символом
-
03-07-2019 - |
Вопрос
Всякий раз, когда я пытаюсь открыть 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)
Спасибо!
Решение
Сообщение от recursive, вероятно, правильное...содержимое файла, скорее всего, закодировано с помощью многобайтовой кодировки.Если это действительно так, то вы, скорее всего, сможете прочитать файл в самом python, не конвертируя его сначала за пределы python.
Попробуйте что-то вроде:
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
Флаг 'b' гарантирует, что файл будет считан как двоичные данные.Вам нужно будет знать (или угадать) исходную кодировку...в этом примере я использовал utf-16, но не YMMV.Это преобразует файл в юникод.Если у вас действительно есть файл с многобайтовыми символами, я не рекомендую преобразовывать его в ascii, так как в конечном итоге вы можете потерять много символов в процессе.
Редактировать:Спасибо, что загрузили файл.В начале файла есть два байта, которые указывают на то, что он действительно использует широкую кодировку.Если вам интересно, откройте файл в шестнадцатеричном редакторе, как некоторые советуют...в текстовой версии вы увидите что-то вроде "ID |." (и т.д.).Точка - это дополнительный байт для каждого символа.
Приведенный выше фрагмент кода, похоже, работает на моем компьютере с этим файлом.
Другие советы
Файл закодирован в некоторой кодировке unicode, но вы читаете его как ascii.Попробуйте преобразовать файл в ascii, прежде чем использовать его в python.
Разве csv - это не простой текстовый файл со значениями, разделенными запятой?Просто попробуйте открыть его с помощью текстового редактора, чтобы проверить, правильно ли сформирован файл.
Чтобы прочитать закодированный файл, вы можете просто заменить open
с codecs.open
.
fread = codecs.open('input.csv', 'r', 'utf-16')
Мне это никогда не приходило в голову, но, как сказал труппо, должно быть, что-то не так с файлом.
Попробуйте открыть файл в Excel / BrOffice Calc и снова сохранить как файл в формате Csv.
Если проблема не устранена, попробуйте использовать подмножество данных:первые 10/последние 10/промежуточные 10 строк файла.
Хорошо, я получил это с помощью поста Джаррета Харди.
это код, который я использовал для преобразования файла в 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)
Спасибо!
Откройте файл в двоичном режиме, 'rb'.Проверьте это в шестнадцатеричном редакторе и проверьте, нет ли нулевого заполнения '00'.Откройте файл в чем-то вроде текстового редактора Scintilla, чтобы проверить символы, присутствующие в файле.
Вот быстрый и простой способ, особенно если python не будет корректно анализировать входные данные
sed 's/ \(.\)/\1/g'