Ich arbeite mit einer TXT-Datei. Ich möchte eine Zeichenfolge des Textes aus der Datei ohne Nicht-ASCII-Zeichen. Ich möchte jedoch Leerzeichen und Punkte lassen. Zur Zeit ziehe ich diese auch aus. Hier ist der Code:
def onlyascii(char):
if ord(char) < 48 or ord(char) > 127: return ''
else: return char
def get_my_string(file_path):
f=open(file_path,'r')
data=f.read()
f.close()
filtered_data=filter(onlyascii, data)
filtered_data = filtered_data.lower()
return filtered_data
Wie soll ich onlyascii () ändern, um Leerzeichen und Punkte zu lassen? Ich stelle mir vor, es ist nicht zu kompliziert, aber ich kann es nicht herausfinden.
Antworten:
Sie können alle Zeichen aus der Zeichenfolge, die nicht gedruckt werden können , mit string.printable wie folgt filtern :
string.printable auf meinem Computer enthält:
BEARBEITEN: Unter Python 3 gibt der Filter eine iterable zurück. Der richtige Weg, um einen String zurück zu bekommen, wäre:
quelle
filter
ist, dass eine iterable zurückgegeben wird. Wenn Sie eine Zeichenfolge zurück benötigen (wie ich es getan habe, weil ich diese bei der Listenkomprimierung benötigt habe), gehen Sie folgendermaßen vor :''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
. Siehe diesen Thread stackoverflow.com/a/20079244/658497Eine einfache Möglichkeit, zu einem anderen Codec zu wechseln, ist die Verwendung von encode () oder decode (). In Ihrem Fall möchten Sie in ASCII konvertieren und alle Symbole ignorieren, die nicht unterstützt werden. Zum Beispiel ist der schwedische Buchstabe å kein ASCII-Zeichen:
Bearbeiten:
Python3: str -> Bytes -> str
Python2: Unicode -> str -> Unicode
Python2: str -> unicode -> str (dekodieren und kodieren in umgekehrter Reihenfolge)
quelle
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
Laut @artfulrobot sollte dies schneller sein als Filter und Lambda:
Weitere Beispiele finden Sie hier http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
quelle
Ihre Frage ist nicht eindeutig; Die ersten beiden Sätze zusammen bedeuten, dass Sie glauben, dass Leerzeichen und "Punkt" keine ASCII-Zeichen sind. Das ist falsch. Alle Zeichen, so dass ord (char) <= 127 ist, sind ASCII-Zeichen. Zum Beispiel schließt Ihre Funktion diese Zeichen aus! "# $% & \ '() * +, -. / Enthält jedoch mehrere andere, z. B. [] {}.
Bitte treten Sie zurück, überlegen Sie ein wenig und bearbeiten Sie Ihre Frage, um uns mitzuteilen, was Sie versuchen, ohne das Wort ASCII zu erwähnen, und warum Sie der Meinung sind, dass Zeichen wie ord (char)> = 128 ignorierbar sind. Auch: welche Version von Python? Wie ist die Kodierung Ihrer Eingabedaten?
Bitte beachten Sie, dass Ihr Code die gesamte Eingabedatei als einzelne Zeichenfolge liest und Ihr Kommentar ("großartige Lösung") zu einer anderen Antwort impliziert, dass Sie sich nicht für Zeilenumbrüche in Ihren Daten interessieren. Wenn Ihre Datei zwei Zeilen wie diese enthält:
das Ergebnis wäre
'this is line 1this is line 2'
... ist es das, was Sie wirklich wollen?Eine bessere Lösung wäre:
onlyascii
Erkennen, dass eine Filterfunktion lediglich einen Wahrheitswert zurückgeben muss, wenn das Argument beibehalten werden soll:
quelle
Sie können den folgenden Code verwenden, um nicht englische Buchstaben zu entfernen:
Dies wird zurückkehren
quelle
Wenn Sie druckbare ASCII-Zeichen möchten, sollten Sie Ihren Code wahrscheinlich wie folgt korrigieren:
Dies entspricht
string.printable
(Antwort von @jterrace), mit Ausnahme des Fehlens von Rückgaben und Tabulatoren ('\ t', '\ n', '\ x0b', '\ x0c' und '\ r'), entspricht jedoch nicht die Reichweite auf Ihre Fragequelle
Ich arbeite mich durch Fluent Python (Ramalho) - sehr zu empfehlen. Listenverständnis One-Ish-Liner, inspiriert von Kapitel 2:
quelle