Pergunta

Em um arquivo de texto, há uma string "eu não gosto deste".

No entanto, quando eu lê-lo em uma string, torna-se "I don \ XE2 \ x80 \ x98t como esta". Eu entendo que \ u2018 é a representação Unicode de "'". Eu uso

f1 = open (file1, "r")
text = f1.read()

comando para fazer a leitura.

Agora, é possível ler a seqüência de tal forma a que, quando ele é lido na seqüência, é "eu não gosto disso", em vez de "I don \ XE2 \ x80 \ x98t assim como este "?

Segundo edit: Eu vi algumas pessoas usam mapeamento para resolver este problema, mas realmente, é que não há built-in de conversão que faz este tipo de ANSI para unicode (e vice-versa) conversão

?
Foi útil?

Solução

Ref: http://docs.python.org/howto/unicode

Reading Unicode de um arquivo é, portanto, simples:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

Também é possível abrir arquivos em modo de atualização, permitindo que ambos leitura e escrita:

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

Editar : Estou assumindo que seu objetivo pretendido é apenas para ser capaz de ler o arquivo corretamente em uma string em Python. Se você está tentando converter para uma string ASCII de Unicode, então não há realmente nenhuma maneira direta para fazê-lo, uma vez que os caracteres Unicode não serão necessariamente existir em ASCII.

Se você está tentando converter para uma string ASCII, tente uma das seguintes opções:

  1. Substitua os caracteres específicos unicode com equivalentes ASCII, se você está olhando apenas para lidar com alguns casos especiais, como neste exemplo em particular

  2. Use o método unicodedata para converter da melhor maneira possível para o próximo mais próximo ASCII equivalente (Ref normalize() e do módulo string.encode() = "https://web.archive.org/web/20090228203858/http: //techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python" rel = "noreferrer"> https://web.archive.org/web/20090228203858/http://techxplorer. cOM / 2006/07/18 / convertendo-unicode-to-ascii-usando-python ):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

Outras dicas

Existem alguns pontos a considerar.

A \ u2018 personagem pode aparecer apenas como um fragmento de representação de uma cadeia Unicode em Python, v.g. se você escrever:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

Agora, se você simplesmente quer imprimir a string unicode prettily, basta usar método encode de unicode:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

Para certificar-se que cada linha de qualquer arquivo seria lido como unicode, é melhor você usar a função codecs.open em vez de apenas open, que permite que você especifique a codificação de arquivo:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

Mas é realmente "I don \ u2018t assim" e não "eu não gosto disso." O personagem u '\ u2018' é um personagem completamente diferente do que "'" (e, visualmente, deve corresponder mais a '`').

Se você está tentando converter unicode codificado em ASCII, você poderia, talvez, manter um mapeamento da pontuação unicode que você gostaria de traduzir para ASCII.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

Há uma enorme quantidade de caracteres de pontuação em unicode , no entanto, mas acho que você pode contar com apenas alguns deles realmente sendo usado por qualquer aplicação que está criando os documentos que você está lendo.

Deixando de lado o fato de que seu arquivo de texto é quebrado (U + 2018 é uma aspa esquerda, não um apóstrofo):. Iconv pode ser usado para caracteres transliterate Unicode para ASCII

Você vai ter que Google por "iconvcodec", uma vez que o módulo não parece ser suportado mais e eu não consigo encontrar uma home page canônico para isso.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

Como alternativa, você pode usar o utilitário de linha de comando iconv para limpar o seu arquivo:

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

Há uma possibilidade de que de alguma forma você tem uma string não-unicode com caracteres de escape Unicode, p.ex.:.

>>> print repr(text)
'I don\\u2018t like this'

Isso realmente aconteceu comigo uma vez antes. Você pode usar um unicode_escape codec para decodificar a seqüência de caracteres para Unicode e, em seguida, codificá-lo para qualquer formato que você deseja:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

Esta é Pythons modo algum te mostrar unicode cordas codificados. Mas eu acho que você deve ser capaz de imprimir a string na tela ou escrevê-lo em um novo arquivo sem problemas.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

Na verdade, U + 2018 é a representação Unicode do caractere especial ‘. Se você quiser, você pode converter instâncias desse personagem para U + 0027 com este código:

text = text.replace (u"\u2018", "'")

Além disso, o que você está usando para gravar o arquivo? f1.read() deve retornar uma string que se parece com isso:

'I don\xe2\x80\x98t like this'

Se ele está retornando este string, o arquivo está sendo escrito incorretamente:

'I don\u2018t like this'

Também é possível ler um arquivo de texto codificado utilizando o método de leitura python 3:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

Com esta variação, não há nenhuma necessidade de importar quaisquer bibliotecas adicionais

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top