Teilen Sie die Textdatei in Teile auf und suchen Sie dann in den Abschnitten Schlüsselphrasen - Python, Dictionary, Split, Iteration, Kontrollstruktur

Ich bin neu bei Python und ich bin schon ein Fan der Sprache. Ich habe ein Programm, das Folgendes tut:

  1. Öffnet eine Textdatei mit Textabschnitten, die durch Sternchen getrennt sind (***)

  2. Verwendet die split() Funktion, um diese Textdatei in durch diese Sternchen getrennte Abschnitte aufzuteilen. Die Sternlinie ist in der gesamten Textdatei einheitlich.

  3. Ich möchte, dass mein Code durch jeden dieser Abschnitte iteriert und Folgendes ausführt:

    • Ich habe ein Wörterbuch mit "Schlüsselphrasen", die Werten zugeordnet sind. Der Wert jedes Schlüssels im Wörterbuch ist 0.

    • Der Code muss jeden Abschnitt durchlaufenerstellt aus dem Split und prüfen, ob die Schlüssel im Wörterbuch in jedem Abschnitt gefunden werden. Wenn ein Schlüsselbegriff gefunden wird, wird der Wert für diesen Schlüssel um 1 erhöht.

    • Sobald der Code durch einen Abschnitt iteriert undhat gezählt, wie viele der Schlüssel in der Sektion sind und addiert die Werte entsprechend, es sollte Wörterbuchschlüssel und die Zählungen (Werte) für diese Einstellung ausdrucken, die Werte auf 0 setzen und zum nächsten Textabschnitt weitergehen, beginnend bei # 3 wieder.

Mein Code ist:

    from bs4 import BeautifulSoup
import re
import time
import random
import glob, os
import string


termz = {"does not exceed" : 0, "shall not exceed" : 0, "not exceeding" : 0,
"do not exceed" : 0, "not to exceed" : 0, "shall at no time exceed" : 0,
"shall not be less than" : 0, "not less than" : 0}
with open("Q:/hello/place/textfile.txt", "r") as f:
sections = f.read().split("**************************************************")
for p in sections[1:]:
for eachKey in termz.keys():
if eachKey in p:
termz[eachKey] = termz.get(eachKey) + 1
print(termz)


#print(len(sections))  #there are thirty sections

#should be if code encounters ***** then it resets the counters and just moves on....
#so far only can count the phrases over the entire text file....

#GO BACK TO .SPLIT()
# termz = dict.fromkeys(termz,0) #resets the counter

Es spuckt aus, was es zählt, aber es ist nicht die erste, letzte oder sogar die ganze Datei, die es verfolgt - ich weiß nicht, was es tut.

Die Druckanweisung am Ende ist fehl am Platz. Das termz = dict.fromkeys(termz,0) line ist eine Methode, die ich gefunden habe, um die Werte von zurücksetzendas Wörterbuch auf 0, ist aber auskommentiert, weil ich mir nicht sicher bin, wie ich das angehen soll. Im Wesentlichen mit Python-Kontrollstrukturen zu kämpfen. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das erstaunlich.

Antworten:

2 für die Antwort № 1

Dein Code ist ziemlich nah. Siehe die Kommentare unten:

termz = {
"does not exceed": 0,
"shall not exceed": 0,
"not exceeding": 0,
"do not exceed": 0,
"not to exceed": 0,
"shall at no time exceed": 0,
"shall not be less than": 0,
"not less than": 0
}

with open("Q:/hello/place/textfile.txt", "r") as f:
sections = f.read().split("**************************************************")

# Skip the first section. (I assume this is on purpose?)
for p in sections[1:]:
for eachKey in termz:
if eachKey in p:
# This is simpler than termz[eachKey] = termz.get(eachKey) + 1
termz[eachKey] += 1

# Move this outside of the inner loop
print(termz)

# After printing the results for that section, reset the counts
termz = dict.fromkeys(termz, 0)

BEARBEITEN

Beispiel Eingabe und Ausgabe:

input = """
Section 1:

This section is ignored.
does not exceed
**************************************************
Section 2:

shall not exceed
not to exceed
**************************************************
Section 3:

not less than"""

termz = {
"does not exceed": 0,
"shall not exceed": 0,
"not exceeding": 0,
"do not exceed": 0,
"not to exceed": 0,
"shall at no time exceed": 0,
"shall not be less than": 0,
"not less than": 0
}

sections = input.split("**************************************************")

# Skip the first section. (I assume this is on purpose?)
for p in sections[1:]:
for eachKey in termz:
if eachKey in p:
# This is simpler than termz[eachKey] = termz.get(eachKey) + 1
termz[eachKey] += 1

# Move this outside of the inner loop
print(termz)

# After printing the results for that section, reset the counts
termz = dict.fromkeys(termz, 0)

# OUTPUT:
# {"not exceeding": 0, "shall not exceed": 1, "not less than": 0, "shall not be less than": 0, "shall at no time exceed": 0, "not to exceed": 1, "do not exceed": 0, "does not exceed": 0}
# {"not exceeding": 0, "shall not exceed": 0, "not less than": 1, "shall not be less than": 0, "shall at no time exceed": 0, "not to exceed": 0, "do not exceed": 0, "does not exceed": 0}

0 für die Antwort № 2
if eachKey in p:
termz[eachKey] += 1  # might do it
print(termz)

Verwandte Fragen