Различные результаты преобразования файла из iso-8859-1 в utv-8 iconv в оболочке и вызов его из python с подпроцессом - PullRequest
1 голос
/ 13 февраля 2010

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

Предположим, у меня есть файл 01234.txt, который iso-8859-1.

Когда я делаю:

iconv --from-code=iso-8859-1 --to-code=utf-8 01234.txt > 01234_utf8.txt

Это дает мне желаемый результат, но когда я делаю то же самое с python и используя подпроцесс:

import subprocess

p0 = subprocess.Popen([<here the same command>], shell=True)
p0.wait()

Я получаю почти тот же результат, но новый файл отсутствует, например. часть строки перед последним и последним.

Вот последние три строки обоих файлов: iconv результат:

795719000 | МАРИЯ ТЕРЕСА МАРРО ВИЛЛАБОБО | 107
259871385 | КРИСТИАМ АЛЬБЕРТО СУАРЕС ВИЛАЛОБОС | 107
311015100 | JORGE MEZA CERVANTES | 09499386

Python результат:

795719000 | MARIA TERESA MARROU VILLALOBOS | 107
259871385 | CHRISTIAM

РЕДАКТИРОВАТЬ: В файле Python, который я пытался использовать coding: utf-8 и coding: iso-8859-1 ( не оба одновременно ).

EDIT: я использовал кодеки в bpython, он прекрасно работает. При использовании его из файла я получаю нежелательный результат.

РЕДАКТИРОВАТЬ: я использую Linux (Ubuntu 9.10) и Python 2.6.2.

Есть предложения?

1 Ответ

1 голос
/ 13 февраля 2010

Вы писали: "В файле python я использовал кодирование: utf-8 и кодирование: iso-8859-1."

Будет использоваться только первый из них. Во-вторых, это определяет кодировку исходного файла Python, в котором он появляется, чтобы компилятор Python мог выполнять свою работу. Следовательно, это не имеет ничего общего с кодировками вашего входного файла и выходного файла. Сценарий для перекодировки данных из кодировки X в кодировку Y может быть написан с использованием только символов ASCII.

Теперь к вашей проблеме:

Вы писали: "p0 = subprocess.Popen([<here the same command>], shell=True)"

Пожалуйста, (всегда), задавая вопрос, покажите ТОЧНЫЙ код, который был запущен, а не то, что вы надеялись / думали, было выполнено. Используйте копирование / вставку, не перепечатывайте его. Не пытайтесь поместить это в комментарии; отредактируйте свой вопрос.

Обновление: Вот GUESS, основанный на симптомах: вы теряете последние несколько байтов файла - похоже на сбой при очистке буфера перед исчезновением. Является ли размер усеченного выходного файла целой степенью 2?

Возможно, вам не следует полагаться на то, что процессор командной строки надежно выполняет > 01234_utf8.txt. Если вы пропустите эту часть команды, появится ли на stdout полная полезная нагрузка? Если да, то вы можете обойти эту проблему, открыв выходной файл самостоятельно, передав его дескриптор как аргумент stdout, а затем выполнив handle.flush () и handle.close ().

...