2016-05-11 5 views
0

Ich schreibe einige Skripts, um einige Textdateien in Python zu verarbeiten. Vor Ort liest das Skript aus einer so einzelnen txt-Datei verwenden iwie Suche Zeichenfolge in einem Ordner von Textdateien mit Python

index_file = open('index.txt', 'r') 
    for line in index_file: 
     .... 

und Schleife durch die Datei eine passende Zeichenfolge zu finden, aber wenn Amazon EMR, die index.txt Datei per se wird mehrere TXT-Dateien aufgeteilt in in einem einzigen Ordner.

Also ich möchte das lokal replizieren und lesen von mehreren TXT-Datei für eine bestimmte Zeichenfolge, aber ich habe Mühe, sauberen Code zu finden, um das zu tun.

Was ist der beste Weg, um dies zu tun, während Sie minimalen Code schreiben?

+0

Sie können os.walk verwenden, um alle Dateien im Verzeichnis abzurufen, durch sie zu durchlaufen und dann die übereinstimmende Zeichenfolgelogik für jede Datei anzuwenden. – pmaniyan

Antwort

1
import os 
from glob import glob 

def readindex(path): 
    pattern = '*.txt' 
    full_path = os.path.join(path, pattern) 
    for fname in sorted(glob(full_path)): 
     for line in open(fname, 'r'): 
      yield line 
# read lines to memory list for using multiple times 
linelist = list(readindex("directory")) 
for line in linelist: 
    print line, 

Dieses Skript definiert ein Generator (see this question for details about generators) durch alle Dateien im Verzeichnis „Verzeichnis“ zu wiederholen, die Erweiterung „txt“ in sortierter Reihenfolge haben. Es liefert alle Zeilen als einen Stream, der nach dem Aufruf der Funktion durchlaufen werden kann, als ob die Zeilen aus einer offenen Datei kämen, da dies scheint, was der Fragesteller wollte. Das Komma am Ende der Druckzeile stellt sicher, dass newline nicht zweimal gedruckt wird, obwohl der Inhalt der for-Schleife sowieso durch den Frageautor ersetzt würde. In diesem Fall kann man line.rstrip() verwenden, um den Zeilenumbruch loszuwerden.

Das Glob-Modul findet alle Pfadnamen, die mit einem bestimmten Muster übereinstimmen, gemäß den von der Unix-Shell verwendeten Regeln, obwohl die Ergebnisse in beliebiger Reihenfolge zurückgegeben werden.

+0

Während dieser Code die Frage beantworten kann, würde das Bereitstellen eines zusätzlichen Kontextes, wie und/oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern. – cpburnz

+0

Hallo emh, wie gebe ich das Verzeichnis mit dem obigen Code an? Ich stimme mit cpburnz zu, bitte fügen Sie weitere Informationen hinzu, wie es funktioniert, da ich nicht viel daraus machen kann. –

+0

@emh gibt es sowieso, um das effizienter zu machen? es ist wirklich langsam, als was ich wirklich will, ist ein Stream, wie Sie hier sagten, aber ich möchte in diesen Stream für jede Zeile, die ich von 'sys.stdin' (von einem anderen Skript) bekommen Schleife, so wird es sehr langsam ist da ein besserer/schneller Weg? –

Verwandte Themen