0
votes

Comment puis-je décoder une chaîne lue à partir d'un fichier?

J'ai lu un fichier dans une chaîne en Python, et il apparaît comme encodé (pas sûr de l'encodage).

ÿþd\x00r\x00o\x00p\x00 \x00t\x00a\x00b\x00l\x00e\x00 

Les lignes sont toutes imprimées en anglais comme prévu

select * from table

mais la requête à la fin apparaît comme

query = ""
with open(file_path) as f:
 for line in f.readlines():
   print(line)
   query += line
query

Que se passe-t-il?


2 commentaires

Des entités HTML au texte Unicode, j'obtiens ÿþdrop table


Ack le contenu de la requête est censé être confidentiel.


3 Réponses :


2
votes

Cela ressemble à des données UTF-16. Pouvez-vous essayer de le décoder avec utf-16?

with open(file_path) as f:
    query=f.decode('utf-16')
print(query)


0 commentaires

2
votes

D'accord avec Carlos, l'encodage semble être UTF-16LE. Il semble y avoir une nomenclature présente, donc encoding = "utf-16" serait capable de détecter automatiquement si elle est petit ou grand-boutiste.

Python idiomatique serait:

query = open(file_path, encoding="...").read()

Dans votre cas, vous ajoutez chaque ligne à la requête, ainsi le code entier peut être réduit à:

with open(file_path, encoding="...") as f:
    for line in f:
        # do something with this line


1 commentaires

Réponse acceptée car c'est la seule qui fonctionne pour moi dans Python 3.6. Appréciez également de le réduire à une ligne de code



0
votes
with open(filePath) as f:
    fileContents =  f.read()
    if isinstance(fileContents, str):
        fileContents = fileContents.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.
    elif isinstance(fileContents, unicode):
        fileContents = fileContents.encode('ascii', 'ignore')

0 commentaires