2009-08-05 11 views
1

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.)

+0

Avez-vous essayé d'ajouter un appel à decode() comme suggéré ci-dessous? – hughdbrown

+0

Et utilisez-vous python 3.x ou une version 2.x? Si le premier, vous obtiendrez des chaînes comme unicode. – hughdbrown

+0

Je retire ma réponse. J'ai essayé la réponse d'Alexander Ljungberg et cela fonctionne parfaitement. – hughdbrown

Répondre

7

Essayez d'utiliser le package de codecs:

import codecs 
buildLog = codecs.open(sys.argv[1], "r", "utf-16").readlines() 

vous pouvez aussi avoir des problèmes avec votre déclaration d'impression qu'il peut essayez de convertir les chaînes à votre encodage de la console. Si vous imprimez pour votre avis, vous pouvez utiliser,

print repr(line) 
+0

Merci, c'est exactement ce dont j'avais besoin. Dire que je cours sur un fichier UTF-8 ou ASCII, est-ce que ça va se casser? –

+0

@Andrew Keeton: Bien sûr, se casser si vous ne changez pas le codage de "utf-16" en "utf-8" ou "ascii" (ou "cp1252") selon le cas. Voir 'http: // www.amk.ca/python/howto/unicode' et' http: // www.joelonsoftware.com/articles/Unicode.html' –

0

Vous avez essayé cela? Lors de l'enregistrement d'un script d'analyse avec des caractères non-ascii, l'interpréteur suggérait un encodage alternatif au début du fichier. Ajouter cela comme première ligne du script a résolu le problème pour moi. Je ne sais pas si c'est ce qui cause votre erreur, cependant.

+0

Cela ne cause certainement pas son erreur. Le vôtre est un problème de temps de compilation - un fichier source codé en cp1252 n'est pas déclaré.Il s'agit d'un problème d'exécution en raison de la tentative de lecture d'un fichier encodé en utf16 comme s'il s'agissait d'un fichier ASCII. –

Questions connexes