Вы могли бы хотеть посмотреть uniq
и sort
приложения.
./yourscript.ksh | sort | uniq
(к вашему сведению, да, вид необходим в этой командной строке, uniq
только, полосы копируют строки, которые сразу являются друг после друга)
РЕДАКТИРОВАНИЕ:
Вопреки тому, что было отправлено [1 112] Aaron Digulla относительно uniq
параметры командной строки:
, Учитывая следующий вход:
class jar jar jar bin bin java
uniq
произведет все строки точно однажды:
class jar bin java
uniq -d
произведет все строки, которые появляются несколько раз, и это распечатает их однажды:
jar bin
uniq -u
произведет все строки, которые появляются точно однажды, и это распечатает их однажды:
class java
Итак, вот три подхода, более или менее как указано или предложено в других ответах:
# -*- coding: utf-8 -*-
import codecs
import unicodedata
x = u"Wikipédia, le projet d’encyclopédie"
xtd = {ord(u'’'): u"'", ord(u'é'): u'e', }
def asciify(error):
return xtd[ord(error.object[error.start])], error.end
codecs.register_error('asciify', asciify)
def ae():
return x.encode('ascii', 'asciify')
def ud():
return unicodedata.normalize('NFKD', x).encode('ASCII', 'ignore')
def tr():
return x.translate(xtd)
if __name__ == '__main__':
print 'or:', x
print 'ae:', ae()
print 'ud:', ud()
print 'tr:', tr()
Выполнить как основной, это испускает:
or: Wikipédia, le projet d’encyclopédie
ae: Wikipedia, le projet d'encyclopedie
ud: Wikipedia, le projet dencyclopedie
tr: Wikipedia, le projet d'encyclopedie
ясно показывая, что подход на основе юникодированных данных, в то время как он удобен тем, что ему не нужна карта перевода xtd
, он не может правильно переводить все символы в автоматическом режиме (он работает для букв с диакритическими знаками, но не для обратного апострофа), поэтому ему также потребуется некоторый вспомогательный шаг, чтобы разобраться с ними (несомненно, до того, каково теперь его тело).
Производительность также интересна. На моем ноутбуке с Mac OS X 10.5 и системой Python 2.5 довольно часто повторяется:
$ python -mtimeit -s'import a' 'a.ae()'
100000 loops, best of 3: 7.5 usec per loop
$ python -mtimeit -s'import a' 'a.ud()'
100000 loops, best of 3: 3.66 usec per loop
$ python -mtimeit -s'import a' 'a.tr()'
10000 loops, best of 3: 21.4 usec per loop
translate
работает на удивление медленно (по сравнению с другими подходами). Я считаю, что проблема в том, что словарь проверяется для каждого символа в случае translate
(и большинства из них нет), а только для тех немногих символов, которые ЕСТЬ там с asciify
подход.
Итак, для полноты, вот подход "усиленных юникодированных данных":
specstd = {ord(u'’'): u"'", }
def specials(error):
return specstd.get(ord(error.object[error.start]), u''), error.end
codecs.register_error('specials', specials)
def bu():
return unicodedata.normalize('NFKD', x).encode('ASCII', 'specials')
это дает правильный результат, НО:
$ python -mtimeit -s'import a' 'a.bu()'
100000 loops, best of 3: 10.7 usec per loop
... скорость уже не так хороша. Итак, если скорость имеет значение, то без сомнения стоит сделать полный диктат перевода xtd
и использовать подход asciify
. Когда несколько дополнительных микросекунд на перевод не имеют большого значения, можно рассмотреть подход bu
просто из-за его удобства (требуется только перевод dict для, надеюсь, небольшого числа специальных символов, которые не
"Правильный" способ сделать это - зарегистрировать свой собственный обработчик ошибок для кодирования / декодирования Unicode, и в этом обработчике ошибок обеспечить замену è на e и ö на o и т. Д.
Примерно так:
# -*- coding: UTF-8 -*-
import codecs
map = {u'é': u'e',
u'’': u"'",
# ETC
}
def asciify(error):
return map[error.object[error.start]], error.end
codecs.register_error('asciify', asciify)
test = u'Wikipédia, le projet d’encyclopédie'
print test.encode('ascii', 'asciify')
Вы также можете найти что-то в библиотеке IBM ICU и привязки Python PyICU , хотя, возможно, это будет меньше работы.
Макетранс (и перевод) затем преобразовать в ascii:
intab = u'áéí' # extend as needed
outtab = u'aei' # as well as this one
table = maketrans(intab, outtab)
text = translate(u"Wikipédia, le projet d’encyclopédie", table)
try:
temp = unicode(text, "utf-8")
fixed = unicodedata.normalize('NFKD', temp).encode('ASCII', action)
return fixed
except Exception, errorInfo:
print errorInfo
print "Unable to convert the Unicode characters to xml character entities"
raise errorInfo
(из здесь )
Без измерений я бы ожидал, что метод .translate для строк Unicode - самое быстрое решение. Тем не менее, вам обязательно следует провести свои собственные измерения.