sobreescribir guardar fin ejercicios dat con como binarios archivos archivo python encoding character-encoding

guardar - ¿Cómo saber la codificación de un archivo en Python?



guardar archivos con python (5)

Esta pregunta ya tiene una respuesta aquí:

¿Alguien sabe cómo obtener la codificación de un archivo en Python? Sé que puede usar el módulo de códecs para abrir un archivo con una codificación específica, pero debe saberlo con anticipación.

import codecs f = codecs.open("file.txt", "r", "utf-8")

¿Hay una manera de detectar automáticamente qué codificación se utiliza para un archivo?

Gracias por adelantado

Edit: Gracias a todos por las respuestas muy interesantes. También te puede interesar http://whatismyencoding.com/ que se basa en chardet (más sobre el sitio funciona con la estructura de python).


Aquí hay un pequeño fragmento de código para ayudarte a adivinar la codificación. Supone entre latin1 y utf8 bastante bien. Convierte una cadena de bytes a una cadena Unicode.

# Attention: Order of encoding_guess_list is import. Example: "latin1" always succeeds. encoding_guess_list=[''utf8'', ''latin1''] def try_unicode(string, errors=''strict''): if isinstance(string, unicode): return string assert isinstance(string, str), repr(string) for enc in encoding_guess_list: try: return string.decode(enc, errors) except UnicodeError, exc: continue raise UnicodeError(''Failed to convert %r'' % string) def test_try_unicode(): for start, should in [ (''/xfc'', u''ü''), (''/xc3/xbc'', u''ü''), (''/xbb'', u''/xbb''), # postgres/psycopg2 latin1: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK ]: result=try_unicode(start, errors=''strict'') if not result==should: raise Exception(u''Error: start=%r should=%r result=%r'' % ( start, should, result))


Desafortunadamente, no hay una manera "correcta" de determinar la codificación de un archivo mirando el archivo en sí. Este es un problema universal, no limitado a Python o cualquier sistema de archivos en particular.

Si está leyendo un archivo XML, la primera línea en el archivo podría darle una pista de lo que es la codificación.

De lo contrario, tendrá que usar algún enfoque basado en heurística como chardet (una de las soluciones que se chardet en otras respuestas) que intenta adivinar la codificación examinando los datos del archivo en formato de byte sin procesar. Si está en Windows, creo que la API de Windows también expone métodos para probar y adivinar la codificación según los datos del archivo.


Hay Unicode Dammit de Beautiful Soup , que usa chardet pero agrega un par de características adicionales.

Intenta leer la codificación desde dentro de los archivos XML o HTML. Luego intenta buscar una lista de materiales o algo así al comienzo del archivo. Si no puede hacer eso, hace uso de chardet .



#!/usr/bin/python """ Line by line detecting encoding if input and then convert it into UTF-8 Suitable for look at logs with mixed encoding (i.e. from mail systems) """ import sys import chardet while 1: l = sys.stdin.readline() e = chardet.detect(l) u = None try: if e[''confidence''] > 0.3: u = unicode(l, e[''encoding'']) except: pass if u: print u, else: print l,