2016-04-06 13 views
0

Ich habe ein Verzeichnis mit Dateien, die Whitespace in ihren Namen haben, habe ich ein Python-Skript, das diese Dateien lädt und führt den tail -n1 Befehl auf ihnen, aber da ist ein Leerzeichen in den Namen , es schlägt fehl. für z.Python Handle Dateinamen mit Leerzeichen in einem Verzeichnis

Ich habe einen dirctory mit der folgenden Datei

data from_10_13_2014 09_00_45.json

und mein Skript enthält die folgende Zeile line = os.popen("tail -n1 %s" % files).read()

wie jetzt ich folgende Fehler

tail: cannot open ‘/home/dataserver/Development/Test/data’ for reading: No such file or directory 
tail: cannot open ‘from_10_13_2014’ for reading: No such file or directory 
tail: cannot open ‘09_00_45.json’ for reading: No such file or directory 

die Problemumgehung erhalten Ich habe jetzt Whitespace mit _ ersetzt, kann ich es irgendwie ohne renamin machen g die Dateien?

Antwort

2

Versuchen Sie "tail -n1 %r" statt, es wird die Zeichenfolgendarstellung der Zeichenfolge, dh tail -n1 "data from_10_13_2014 09_00_45.json".

Oder noch besser, wechseln Sie zur Verwendung des Moduls subprocess. Hier können Sie beispielsweise verwenden, um die subprocess.check_output Funktion, die Argumente automatisch entkommt:

tail_line = subprocess.check_output(["tail", "-n1", files]) 

Ich würde empfehlen Sie nicht weißen Raum zu verwenden, überhaupt in Dateinamen, ist es immer am Ende Skripte am Ende zu brechen. Vielleicht können Sie ein zweites Skript schreiben, das Ihre Dateinamen normalisiert?

+1

Danke, leider habe ich keine Kontrolle über die Dateinamen, sie von einem Sensor erzeugt werden, die wir verwenden, und es gibt keine Möglichkeit, es zu ändern. – cyberbemon

+0

Ah, das Leben ist manchmal schwer :) –

0

Ersetzen Sie durch \ in Ihrem files. Also ein Backslash + Leerzeichen.

0

Das Problem ist, dass Sie auf popen angewiesen sind, um die Befehlszeile für Sie zu analysieren, und natürlich verwendet es Leerzeichen, um einige der Analyse zu tun. Eine bessere Lösung besteht darin, eine Liste einzelner Argumente zu erstellen, so dass keine Befehlszeilenparsierung stattfinden muss.

Der einfachste Weg, das zu tun ist subprocess.check_output zu verwenden:

line = subprocess.check_output(["tail", "-n1", "/tmp/junk.py"]) 
Verwandte Themen