2016-05-29 6 views
0

Der Titel wird wahrscheinlich niemandem gerecht, also lass mich direkt darauf eingehen. Ich versuche, ein Programm zu schreiben, das mein Laufwerk E:\ für eine Liste von Wörtern wie water, fire und air scannen wird. In meinem Laufwerk E:\ habe ich natürlich Ordner innerhalb von Ordnern und Dateien innerhalb der Ordner und so weiter.Verzeichnisse scannen, Zeichenkette in Dateien finden und Ergebnisse drucken

Ich möchte die Funktion search (path, text) aufrufen, die im Text die Liste ['water', 'fire', 'air'] eingeben kann. So würde es so aussehen: search('E:\\', ['water', 'fire', 'air']).

Ich möchte in der Lage sein, das Verzeichnis (die Verzeichnisse) zu scannen und mit jeder Zeile, die gescannt wird, Scanning: E:\\... zu drucken. Ich habe das. Ich möchte auch, wenn es Wasser, Feuer und/oder Luft findet, um In (directory name) found water, fire auszugeben; In (directory name) found air usw. Ich habe den größten Teil dieses Teils. Ich kann nicht herausfinden, wie man es bekommt, um mehrere Wörter anzuzeigen (falls zutreffend).

Ein Ausgang ich suche wie dies zum Beispiel wäre:

Scanning: E:\ Scanning: E:\Python Fun! Scanning: E:\Python Fun!\1st Week Scanning: E:\Python Fun!\2nd Week Scanning: E:\Python Fun!\3rd Week In E:\Python Fun!\3rd Week\elements.txt found 'fire', 'water' Scanning: E:\Python Fun!\4th Week Scanning: E:\Python Fun!\5th Week In E:\Python Fun!\5th Week\elements.txt found 'air Scanning... Und so weiter

Hier ist mein Code:

import os 
def search(path, text): 

    for text in texts: 
     if os.path.isfile(path): #base case 
      if text in path: 
       print(path) 
      return 

    if not os.path.exists(path): 
     return 

    for item in os.listdir(path): 
     itempath = os.path.join(path, item) 

     if os.path.isfile(itempath): 
      if text in item: 
       print('In {} found {}'.format(itempath, word)) 

     elif os.path.isdir(itempath): 

      search(itempath, text) 
      print('Scanning:', path) 
      #open(itempath).read() #tested this but got an error. See below. 
     else: #unknown object type 
      pass 

search('E:\\',['water','fire', 'air']) 

Der Traceback Fehler, den ich bekam, war AttributeError: 'str' object has no attribute 'read' . Also habe ich es auskommentiert.

Mit diesem Code bekomme ich Ergebnisse von im Grunde den letzten Buchstaben von was auch immer in meiner Liste ist, in diesem Fall r als was wird gesucht. Ich denke das liegt an einer extra Schleife? Aber nicht genau.

Ich weiß, ich muss irgendwo eine open filename hinzufügen, aber wieder bin ich verwirrt, wie man das implementiert. Ich habe gerade angefangen, etwas über das OS-Modul zu lernen, und hier kommt der Großteil der Verwirrung ins Spiel. Ich bin ratlos.

Antwort

0

Für Ihre Fahrt betrachten rekursiv iterieren glob anstelle:

import glob 

for filename in glob.iglob('E:/**/**', recursive=True): 
    print("Scanning", filename); 
    with open(filname, 'r', encoding='utf-8') as file: content = file.read() 
    for text in texts: 
     if text in content: 
      print("Found:", text, " - ", filename); 

Um den Inhalt der Dateien zu scannen, müssen Sie sie auch open().

+0

Gibt es möglicherweise einen Weg, es ohne glob zu tun? Es wird wahrscheinlich den Code weniger einfach machen, was erwartet wird. Aber ich würde gerne die Details von Python lernen und dann später in die Abkürzungen einsteigen, damit ich weiß, was ich mache und worauf ich achten muss, wenn ich mit einer komplizierten Situation konfrontiert werde. – adhamncheese