2010-04-30 6 views
4

Ça a été une longue journée et je suis un peu perplexe.Python - convertir des chaînes de caractères larges d'un fichier binaire en chaînes unicode Python

Je suis en train de lire un fichier binaire qui contient beaucoup de chaînes de caractères larges et je veux les exporter en tant que chaînes Unicode Python. (Pour décompresser les données non-chaîne J'utilise le module struct, mais je ne sais pas comment faire la même chose avec les cordes.)

Par exemple, lire le mot « série »:

myfile = open("test.lei", "rb") 
myfile.seek(44) 
data = myfile.read(12) 

# data is now 'S\x00e\x00r\x00i\x00e\x00s\x00' 

Comment est-ce que je peux encoder ces données brutes de caractères larges en tant que chaîne Python?

Edit: J'utilise Python 2,6

+0

'file' n'est pas censé être utilisé pour ouvrir des fichiers; 'open' est. 'codecs.open' est génial si c'est vraiment un fichier texte mais un dans un encodage un peu bizarre. –

+0

Mike G - tout à fait raison, j'ai corrigé l'exemple. En fait, j'utilise normalement 'open', mais quelque chose était vicieux avec ma coque ipython aujourd'hui et cela m'a donné une erreur obscure. Je l'aurais probablement écrasé avec autre chose. – Mikesname

Répondre

6
>>> data = 'S\x00e\x00r\x00i\x00e\x00s\x00' 
>>> data.decode('utf-16') 
u'Series' 
0

Hmm, pourquoi dites-vous "ouvrir" est préférable à "fichier"? Je vois dans la référence (Python 2.5):

3,9 fichier Objets de fichiers sont mis en œuvre à l'aide de stdio de C et peuvent être créés avec le fichier constructeur intégré () décrite dans section 2.1, `` Built-in Fonctions. '' 3.6 ----- Note de bas de page (3.6) file() est nouveau dans Python 2.2. L'ancien built-in open() est un alias pour file().

2

Si la chaîne en question est connue pour ne pas avoir de caractères au-delà de FF, une autre possibilité qui génère une chaîne plutôt qu'un objet unicode, par éludant le zéro-octets:

>>> 'S\x00e\x00r\x00i\x00e\x00s\x00'[::2] 
'Series' 
2

Je recommande aussi pour utiliser rstrip avec '\x00' après le décodage - pour supprimer tous les caractères de fin '\x00', à moins, bien sûr, qu'ils ne sont pas nécessaires.

>>> data = 'S\x00o\x00m\x00e\x00\x20\x00D\x00a\x00t\x00a\x00\x00\x00\x00\x00' 
>>> print '"%s"' % data.decode('utf-16').rstrip('\x00') 
>>> "Some Data" 

Sans rstrip('\x00') le résultat sera avec des espaces de fin:

>>> "Some Data "