Configuration
J'écris un script pour traiter et annoter les journaux de construction à partir de Visual Studio. Les logs de construction sont HTML, et d'après ce que je peux dire, Unicode (UTF-16?) Aussi bien. Voici un extrait de l'un des fichiers:Recherche d'un fichier Unicode en utilisant Python
c:\anonyfolder\anonyfile.c(17169) : warning C4701: potentially uninitialized local variable 'object_adrs2' used
c:\anonyfolder\anonyfile.c(17409) : warning C4701: potentially uninitialized local variable 'pclcrd_ptr' used
c:\anonyfolder\anonyfile.c(17440) : warning C4701: potentially uninitialized local variable 'object_adrs2' used
Les 16 premiers octets du fichier ressemble à ceci:
feff 003c 0068 0074 006d 006c 003e 000d
Le reste du fichier est jonché d'octets nuls ainsi. Je voudrais être en mesure d'effectuer des recherches de chaînes et expressions régulières/correspondances sur ces fichiers. Cependant, lorsque j'essaie le code suivant, j'obtiens un message d'erreur.
buildLog = open(sys.argv[1]).readlines()
for line in buildLog:
match = u'warning'
if line.find(match) >= 0:
print line
Le message d'erreur:
Traceback (most recent call last):
File "proclogs.py", line 60, in
if line.find(match) >= 0:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
Apparemment, il étouffe sur le 0xff
octet 0xfeff
au début du fichier. Si je saute la première ligne, je reçois aucune correspondance:
buildLog = open(sys.argv[1]).readlines()
for line in buildLog[1:]: # Skip the first line.
match = u'warning'
if line.find(match) >= 0:
print line
De même, en utilisant le match = 'warning'
non-Unicode ne donne aucun résultat.
Question
Comment puis-je rechercher portably un fichier Unicode en utilisant des chaînes et des expressions régulières en Python? De plus, comment puis-je faire pour que je puisse reconstruire le fichier original? (Le but est de pouvoir écrire des annotations sur les lignes d'avertissement sans mutiler le fichier.)
Avez-vous essayé d'ajouter un appel à decode() comme suggéré ci-dessous? – hughdbrown
Et utilisez-vous python 3.x ou une version 2.x? Si le premier, vous obtiendrez des chaînes comme unicode. – hughdbrown
Je retire ma réponse. J'ai essayé la réponse d'Alexander Ljungberg et cela fonctionne parfaitement. – hughdbrown