2009-11-06 7 views
5

При попытке исправить файл PML (Palm Markup Language), похоже, что у моего тестового файла есть символы, отличные от ASCII, которые заставляют MakeBook жаловаться. Решение состоит в том, чтобы разделить все символы, отличные от ASCII, в PML.Как удалить расширенный ascii с помощью python?

Таким образом, в попытке исправить это в Python, у меня есть

import unicodedata, fileinput 

for line in fileinput.input(): 
    print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 

Однако это приводит к ошибке, что линия должна быть «юникода, не ул». Вот фрагмент файла.

\B1a\B \tintense, disordered and often destructive rage†.†.†.\t 

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

+0

Вы хотите, чтобы отфильтровать любой символ, чей ASCII значение больше, чем 255? –

+0

Строго говоря, нет такой вещи, как Extended ASCII. ASCII определяет значения от 0 до 127. Все, что выше этого, может быть интерпретировано произвольно. Возможно, вы должны использовать термин * не-ASCII-символы *. – dreamlax

+0

Связанный: Функция безопасного выхода для вывода терминала http://stackoverflow.com/questions/437476/safe-escape-function-for-terminal-output – jfs

ответ

0

При чтении из файла на Python вы получаете байтовые строки, ака «str» в Python 2.x и ранее. Вам необходимо преобразовать их в тип «unicode», используя метод decode. например:

line = line.decode('latin1') 

Замените 'latin1' на правильную кодировку.

5

Попробуйте print line.decode('iso-8859-1').encode('ascii', 'ignore') - это должно быть намного ближе к тому, что вы хотите.

+0

Это похоже на работу, хотя MakeBook теперь жалуется на незаконные коды управления. –

+0

@Jauder, вы можете, конечно же, удалить управляющие коды, например, после вышеупомянутого 'clean = ''.join (c для c в строке, если ord (c)> = 32) '(удаляет ВСЕ управляющие коды, включая новую строку и возврат каретки - настраивается на вкус, мы не можем сделать это для вас, не зная, какие управляющие коды вы хотите Удалить!-). –

+0

@Alex, если бы я знал, я бы =). Проблема в том, что я работаю только с Java-прогой без источника, который только испускает загадочное сообщение об ошибке. http://gist.github.com/227882 –

5

Вы хотели бы рассматривать line как данные ASCII кодировки, так что ответ расшифровать его текст с использованием ASCII-кодека:

line.decode('ascii')

Это повысит ошибки для данных, которые в действительности не является ASCII кодировке. Вот как игнорировать эти ошибки:

line.decode('ascii', 'ignore').

Это дает вам текст, в форме экземпляра unicode. Если вы предпочитаете работать с данными (ASCII-кодировке), а не текст, вы можете перекодировать его, чтобы получить обратно экземпляр str или bytes (в зависимости от версии Python):

line.decode('ascii', 'ignore').encode('ascii')

2

уронить символы, отличные от ASCII, используют line.decode(your_file_encoding).encode('ascii', 'ignore'). Но, наверное, лучше использовать управляющие последовательности PLM для них:

import re 

def escape_unicode(m): 
    return '\\U%04x' % ord(m.group()) 

non_ascii = re.compile(u'[\x80-\uFFFF]', re.U) 

line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t' 
print non_ascii.sub(escape_unicode, line) 

Это выводит \B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\t.

Отбрасывание не-ASCII и управляющие символы с регулярным выражением слишком легко (это можно безопасно использовать после побега):

regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]') 
regexp.sub('', line) 

 Смежные вопросы

  • Нет связанных вопросов^_^