2013-05-14 2 views
1

J'essaie de convertir les fichiers de syntaxe SPSS en HTML lisible. Cela fonctionne presque parfaitement, sauf qu'un caractère (unique) non imprimable est inséré dans le fichier HTML. Il ne semble pas avoir un code ASCII et ressemble à un petit point. Et ça cause des problèmes.Évitez les caractères non imprimables dans le fichier html écrit par Python

Il se produit (uniquement) dans la deuxième ligne du fichier HTML, correspondant toujours à la première ligne du fichier d'origine. Ce qui laisse deviner probablement à quelle ligne (s) de Python la cause du problème (s'il vous plaît voir les commentaires)

Le code qui semble provoquer c'est

rfil = open(fil,"r") #rfil = Read File, original syntax 
    wfil = open(txtFil,"w") #wfil = Write File, HTML output 
    #Line below causes problem?? 
    wfil.write("<ol class='code'>\n<li>") 
    cnt = 0 
    for line in rfil: 
     if cnt == 0: 
      #Line below causes problem?? 
      wfil.write(line.rstrip("\n").replace("'",'&#39;').replace('"','&#34;')) 
     elif len(line) > 1: 
      wfil.write("</li>\n<li>" + line.strip("\n").replace("'",'&#39;').replace('"','&#34;')) 
     else: 
      wfil.write("<br /><br />") 
     cnt += 1 
    wfil.write("</li>\n</ol>") 
    wfil.close() 
    rfil.close() 

Capture d'écran du résultat

enter image description here

+0

Que signifie "causer des problèmes" dans ce cas? Je suis un utf-8 fondamentaliste. Lorsque vous lisez en python, essayez de le convertir en utf-8 ou unicode en premier. Lorsque vous écrivez, utilisez toujours utf-8. Mais je ne sais pas vraiment si ce conseil répond à votre problème. –

+0

Vous pouvez supprimer un fichier de fichiers non imprimables en utilisant: 'import string; "" .join (s pour s dans foo si s dans string.printable) '[Plus d'informations ici] (http://stackoverflow.com/a/16402009/1076493) – timss

+0

@AdrianRatnapala:" Causing trouble "signifie que le non Le caractère imprimable est probablement inséré par cette ligne de code Python. Quand je regarde la page HTML finale dans le navigateur, cela se révèle vraiment bizarre et c'est ce que j'essaie de corriger. – RubenGeert

Répondre

4

Le fichier d'entrée semble commencer par un byte order mark (BOM), pour indiquer l'encodage UTF-8. Vous pouvez décoder le fichier en chaînes Unicode en ouvrant avec

import codecs 
rfil = codecs.open(fil, "r", "utf_8_sig") 

L'encodage utf_8_sig ceuxci la nomenclature au début.

Certains programmes reconnaissent la nomenclature, d'autres non. Pour écrire le fichier sans nomenclature, utilisez

wfil = codecs.open(txtFil, "w", "utf_8") 
1

Ce que vous voyez est un byte-order mark, or BOM. La façon dont vous le voyez, \xef\xbb\xbf, dit que les chaînes avec lesquelles vous travaillez sont en réalité UTF-8; vous pouvez les convertir en Unicode (line.decode('utf-8')) pour faciliter la manipulation.

Ensuite, vous pouvez augmenter la logique de la première ligne afin qu'il supprime en toute sécurité la nomenclature:

for raw_line in rfil: 
    line = raw_line.decode('utf-8') # now line is Unicode 
    if cnt == 0 and line[0] == '\ufeff': 
     line = line[1:] # cut the first character, which is a BOM 
    ... 
+1

'codecs.open ('fname', 'r', 'utf-8-sig')' devrait se débarrasser de la 'BOM' – root

Questions connexes