Detectar corretamente a codificação o tempo todo é impossível .
(De chardet FAQ :)
No entanto, algumas codificações são otimizadas para idiomas específicos, e os idiomas não são aleatórios. Algumas seqüências de caracteres aparecem o tempo todo, enquanto outras não fazem sentido. Uma pessoa fluente em inglês que abre um jornal e encontra “txzqJv 2! Dasd0a QqdKjvz” reconhece instantaneamente que isso não é inglês (embora seja composto inteiramente de letras em inglês). Ao estudar muito texto "típico", um algoritmo de computador pode simular esse tipo de fluência e adivinhar o idioma de um texto.
Existe a biblioteca chardet que usa esse estudo para tentar detectar a codificação. chardet é uma porta do código de detecção automática no Mozilla.
Você também pode usar UnicodeDammit . Ele tentará os seguintes métodos:
- Uma codificação descoberta no próprio documento: por exemplo, em uma declaração XML ou (para documentos HTML) uma tag META http-equiv. Se a Beautiful Soup encontrar esse tipo de codificação no documento, ele analisará o documento novamente desde o início e tentará a nova codificação. A única exceção é se você especificou explicitamente uma codificação, e essa codificação realmente funcionou: ela ignorará qualquer codificação encontrada no documento.
- Uma codificação foi detectada observando os primeiros bytes do arquivo. Se uma codificação for detectada nesse estágio, ela será uma das codificações UTF- *, EBCDIC ou ASCII.
- Uma codificação detectada pela biblioteca chardet , se você a tiver instalada.
- UTF-8
- Windows-1252
chardet
referência. Parece bom, embora um pouco lento.Outra opção para calcular a codificação é usar libmagic (que é o código por trás do comando file ). Há uma profusão de ligações python disponíveis.
As ligações python que vivem na árvore de origem do arquivo estão disponíveis como o pacote debian python-magic (ou python3-magic ). Pode determinar a codificação de um arquivo, fazendo:
Existe um pacote de pip python-magic com nome idêntico, mas incompatível, no pypi que também usa
libmagic
. Também pode obter a codificação, fazendo:fonte
libmagic
é realmente uma alternativa viável parachardet
. E ótimas informações sobre os diferentes pacotes nomeadospython-magic
! Estou certo de que este ambigüidade morde muitas pessoasfile
não é particularmente bom em identificar a linguagem humana em arquivos de texto. É excelente para identificar vários formatos de contêiner, embora às vezes você precise saber o que significa ("documento do Microsoft Office" pode significar uma mensagem do Outlook etc.).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. A codificação do arquivo de acordo com o vim:set fileencoding
élatin1
.errors='ignore'
, a saída do código de exemplo é menos útilbinary
.Algumas estratégias de codificação, por favor, descomente o gosto:
Você pode verificar a codificação abrindo e lendo o arquivo na forma de um loop ... mas pode ser necessário verificar primeiro o tamanho do arquivo:
fonte
io
, comoio.open(filepath, 'r', encoding='utf-8')
, o que é mais conveniente, porquecodecs
não converte\n
automaticamente na leitura e gravação. Mais sobre HEREAqui está um exemplo de leitura e obtenção pelo valor nominal de uma
chardet
previsão de codificação, lendon_lines
o arquivo no caso de ele ser grande.chardet
também fornece uma probabilidade (ou sejaconfidence
) de sua previsão de codificação (não olhou como eles criam isso), que é retornada com sua previsão dechardet.predict()
, para que você possa trabalhar de alguma forma, se quiser.fonte
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
Já tentei essa função no Python 3.6, funcionou perfeitamente com as codificações "ascii", "cp1252", "utf-8", "unicode". Então isso é definitivamente positivo.fonte
Dependendo da sua plataforma, opto por usar o
file
comando linux shell . Isso funciona para mim desde que o estou usando em um script que roda exclusivamente em uma de nossas máquinas Linux.Obviamente, essa não é uma solução ou resposta ideal, mas pode ser modificada para atender às suas necessidades. No meu caso, só preciso determinar se um arquivo é UTF-8 ou não.
fonte
Isso pode ser útil
fonte
É, em princípio, impossível determinar a codificação de um arquivo de texto, no caso geral. Portanto, não, não existe uma biblioteca Python padrão para fazer isso por você.
Se você tiver conhecimento mais específico sobre o arquivo de texto (por exemplo, que é XML), pode haver funções de biblioteca.
fonte
Se você conhece algum conteúdo do arquivo, pode tentar decodificá-lo com várias codificações e ver qual está faltando. Em geral, não há como, pois um arquivo de texto é um arquivo de texto e esses são estúpidos;)
fonte
Este site possui código python para reconhecimento de ascii, codificação com boms e utf8 no bom: https://unicodebook.readthedocs.io/guess_encoding.html . Leia o arquivo na matriz de bytes (dados): http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Aqui está um exemplo. Eu estou no osx.
fonte