2014-06-18 10 views
6

Voglio eliminare tutti i caratteri "\ L" che trovo quando leggo il file. Ho provato a utilizzare questa funzione quando ho letto una riga:Elimina il carattere^L in un file di registro

def cleanString(self, s): 
      if isinstance(s, str): 
        s = unicode(s,"iso-8859-1","replace") 
        s=unicodedata.normalize('NFD', s) 
        return s.encode('ascii', 'ignore') 

Ma non elimina questo carattere. Qualcuno sa come farlo?

Ho provato ad utilizzare la funzione replace pure, ma non è meglio:

s = line.replace("\^L","") 

Grazie per le vostre risposte.

+2

La rappresentazione Python di '^ L' è' '\ x0c'' o '' \ f''. –

risposta

3

Probabilmente non si dispone dei caratteri letterali ^ e L, ma qualcosa che viene visualizzato come ^L.

Questo sarebbe il carattere di avanzamento del modulo.

Quindi fare s = line.replace('\x0C', '').

+0

HO Non posso credere che fosse così semplice. Grazie ero su quel problema da stamattina;) – Kvasir

2

^L (codepoint 0C) è un carattere ASCII, quindi non sarà interessato da una codifica in ASCII. Si potrebbe filtrare fuori tutti i caratteri di controllo usando una piccola regex (e, mentre ci sei, filtrare tutto ciò non ASCII pure):

import re 
def cleanString(self, s): 
    if isinstance(s, str): 
     s = unicode(s,"iso-8859-1","replace") 
     s = unicodedata.normalize('NFD', s) 
     s = re.sub(r"[^\x20-\x7f]+", "", s) # remove non-ASCII/nonprintables 
     return str(s)      # No encoding necessary 
2

È quasi se fosse corretto, basta una rappresentazione diversa per ^L.

s = line.replace("\x0c", "") 

Ecco una funzione che restituirà la rappresentazione di qualsiasi carattere di controllo.

def cc(ch): 
    return chr(ord(ch) & 0x1f) 

>>> cc('L') 
'\x0c' 

Alcuni caratteri di controllo hanno rappresentazioni alterni, quelli comuni sono '\r' per ^M e '\n' per ^J. Questi sono elencati in un grafico in the documentation for string literals in base al nome indicato in un ASCII control code chart.

Problemi correlati