2017-04-18 3 views
0

Ich möchte eine Liste von Smileys in einer Liste von Dateien (.txt) in meinem Pfad/test/zählen.Verschiedene Strings in mehreren Dateien zählen

Hier ist mein Ansatz, um einen Smiley in allen Dateien zu zählen.

Wie kann ich jetzt verschiedene Smileys loopen und das Ergebnis für jeden Smiley separat ausdrucken? Da ich bereits verschiedene Dateien durchlaufe, wird es kompliziert.

+0

Was Sie bedeuten kann Du willst Smileys wie ': D',';) ',':) 'usw. zählen? – blacksite

+0

Ich meine, ich möchte, dass das Skript die Zahlen von etwa 20 Smileys zählt und die "Anzahl von X in allen Dateien gleich ___________" (X = ein Smiley) für jeden ausgibt. Die Smileys enthalten :), :-),:] und einige weitere Varianten von positiven und negativen Smileys. –

Antwort

0

Über Ihre Frage: Sie können ein Wörterbuch mit der Zählung jeder Zeichenfolge zu halten und das zurückgeben. Aber wenn Sie Ihre derzeitige Struktur beibehalten, wird es nicht nett sein, den Überblick zu behalten.

Welche führt zu meinen Vorschlägen:

  • Sie sind ohne ersichtlichen Grund die gesamte Datei im Speicher zu halten, können Sie durch sie gehen Zeile für Zeile und überprüfen Sie die Strings in der aktuellen Zeile.
  • Sie lesen die gleichen Dateien auch mehrmals, während Sie sie nur einmal lesen und überprüfen können, ob die Zeichenfolgen vorhanden sind.
  • Sie überprüfen die Erweiterung der Datei, die wie ein Job für glob klingt.
  • Sie können eine defaultdict verwenden, so dass Sie nicht darauf achten müssen, ob die Zählung anfänglich 0 war oder nicht.

Modified Code:

from collections import defaultdict 
import glob 

SMILIES = [':)', ':P', '=]'] 

def count_in_files(string_list): 
    results = defaultdict(int) 
    for file_name in glob.iglob('*.txt'): 
     print(file_name) 
     with open(file_name) as input_file: 
      for line in input_file: 
       for s in string_list: 
        if s in line: 
         results[s] += 1 
    return results 

print(count_in_files(SMILIES)) 
  • schließlich mit diesem Ansatz, wenn Sie Python verwenden> = 3.5, können Sie den glob Aufruf for file_name in glob.iglob('**/*.txt', recursive=True) ändern, so wird es rekursiv, falls die Suche du brauchst es.

Dies druckt etwas wie: "Schleife verschiedene Smileys"

defaultdict(<class 'int'>, {':P': 2, ':)': 1, '=]': 1})

+0

Danke, dieser Ansatz hat funktioniert! :-) Und es ist tatsächlich viel schneller als das alte. –

0

Sie könnten Ihren Suchstring zu einem Funktionsparameter machen und dann Ihre Funktion mehrmals mit verschiedenen Suchbegriffen aufrufen.

def count_string_occurrence(string): 
    import os 
    total = 0 
    x = 0 
    for file in os.listdir("C:/users/M/Desktop/test"): 
     if file.endswith(".txt"): 
      f=open(file,encoding="utf8") 
      contents = f.read() 
      f.close() 
      x=contents.count(string) 
      total +=int(x) #calculate occurance of smiley in all files 
    return total 

smilies = [':)', ':P', '=]'] 
for s in smilies = 
    total = count_string_occurrence(s) 
    print("Number of {} in all files equals {}".format(s, total)) 

Ein anderer Ansatz eine Liste der Smilies Ihre Funktion und führen Sie dann die Iteration innerhalb des if Block passieren würde. Vielleicht speichern Sie das Ergebnis in einem dict im Formular { ':)': 5, ':P': 4, ... }

Verwandte Themen