2016-04-05 8 views
0

Mit iPython versuche ich, alle Textdateien in einem Verzeichnis zu durchlaufen, eine Operation für jede Textdatei (Beschneiden eines Teils der Textdatei nach der Zeile beginnend mit "BEGIN") und dann Speichern Sie die Ergebnisse in einer anderen temp.txt. Wenn ich jedoch !cat file_path mache, dauert es nicht file_path als das Verzeichnis und es interpretiert es als eine Zeichenfolge mit dem Namen 'file_path' statt. Gibt es trotzdem, dass ich die Zeichenfolge file_path in ein literales Verzeichnis konvertieren kann, dass es von !cat verwendet werden kann?Konvertieren von Zeichenfolgen in Literalverzeichnisse

import os 
for fn in os.listdir('./dir'): 
    if fn.endswith('.txt'): 
     file_path='./dir'+fn 
     print "file path is:", file_path 
     !cat file_path | sed -e '1,/BEGIN/d'>temp.txt 

Ausgänge:

file path is: ~/Documents/dir/doc.txt 
cat: file_path: No such file or directory 
+0

Soweit ich weiß, kann man '! Cat' nicht einfach einfügen, um zu entkommen und einen Shell-Befehl auszuführen. Sie müssten 'subprocess.Popen' oder etwas ähnliches verwenden. Warum nicht einfach mit Python zuschneiden oder alles in der Shell tun, anstatt sie auf diese Weise zu mischen? (Dies hat auch einen "nutzlosen Gebrauch der Katze") Ist das IPython und deshalb funktioniert das '!'? Sie wollen wahrscheinlich nicht '/ Dokumente', sondern' ~/Dokumente', die ich schätzen würde? – beroe

+0

Ich fand es sauberer auf diese Weise beide zu mischen. Aber ja, es ist nur in Python/Unix möglich. Und ja, das ist iPython und es ist möglich, an jedem Punkt mit Hilfe von Unix umzuschalten! Zeichen und das richtige Verzeichnis ist ~/Dokumente. – Peyman

+0

Vielleicht fügen Sie das Tag 'IPython' hinzu – beroe

Antwort

0

Sie haben file_path in geschweiften Klammern umschließen sie als Python-Ausdruck zu markieren. Versuchen Sie, diese als letzte Zeile des Skripts:

!cat {file_path} | sed -e '1,/BEGIN/d'>temp.txt 
+0

Perfekt! Danke Daniel, es hat funktioniert! – Peyman

+0

@Peyman froh, ich könnte helfen! Fühlen Sie sich frei, meine Antwort als akzeptiert zu markieren, indem Sie auf das Häkchen klicken, damit ich diese süßen Rufpunkte ernten kann :) –

+0

yeah absolut! – Peyman

0

In meiner bescheidenen Meinung Sie „/“ in der file_path Variable hinzuzufügen vergessen:

import os 
for fn in os.listdir('./dir'): 
    if fn.endswith('.txt'): 
     file_path='./dir/'+fn 
     print file_path 

Durch die Art und Weise in diesem Fall, dass Sie bash verwenden können:

for i in `ls ./dir`; do if [[ $i == d*.txt ]]; then cat ./dir/$i | sed -e '1,/BEGIN/d'>temp.txt ; fi; done 
+0

der Mangel f ''/'' 'ist in Ordnung, wie ich es in' '' dir''' selbst enthalten hatte. Ich wollte auch eine Kombination aus Python und Bash verwenden, da ich den Rest des Codes benötige, den ich hier nicht angegeben habe :) – Peyman