[英]How to count the number of words in a paragraph and exclude some words (from a file)?
我剛剛開始學習Python,所以我的問題可能有點傻。 我正在嘗試創建一個程序:
- 導入文本文件(得到它)
- 計算單詞總數(得到它),
- 計算特定段落中的單詞數量,從特定短語開始(例如“P1”,以另一個參與者“P2”結尾),並從我的單詞計數中排除這些單詞。 不知怎的,我最終得到了一些可以計算字符數的東西:/
- 單獨打印段落(得到它)
- 從我的字數中排除“P1”“P2”等字。
我的文本文件如下所示:
P1:Bla bla bla。
P2:Bla bla bla bla。
P1:Bla bla。
P3:Bla。
我最終得到了這段代碼:
text = open (r'C:/data.txt', 'r')
lines = list(text)
text.close()
words_all = 0
for line in lines:
words_all = words_all + len(line.split())
print 'Total words: ', words_all
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
任何想法如何改進它?
謝謝
您不應該使用標識符文本調用open ('zery.txt', 'r')
。 它不是文件中的文本,它是文件的處理程序,在文檔中描述為“文件類對象”(順便說一句,我從不理解它的含義,“文件類對象”)
。
with open ('C:/data.txt', 'r') as f:
........
........
比...更好
f = open ('C:/data.txt', 'r')
......
.....
f.close()
。
您應該閱讀有關split()的說明,這樣您就可以看到:
with open ('C:/data.txt', 'r') as f:
text = f.read()
words_all = len(text.split())
print 'Total words: ', words_all
。
如果您的文本結構是:
P1: Bla bla bla.
P2: Bla bla bla bla.
P1: Bla bla.
P3: Bla.
然后words_par.endswith("P1" or "P2" or "P3")
總是為假 ,因此不執行所需的分割。
因此, words_par不會成為一個列表,它仍然是一個字符串,這就是字符計數的原因。
。
此外,您的代碼肯定是錯誤的。
如果執行了拆分,那么它將是在代碼開頭的第一個for循環中獲得的最后一行 ,它將被重復分割。
所以,而不是
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3"):
words_par = line.split()
當然是:
for line in lines:
if line[0:2] in ("P1","P2","P3") :
words_par = line.split()
也許我完全不了解要求,但我會盡我所能。
關於計算所有單詞的第一部分是相當不錯的。 我會稍微縮短一點:
with open('C:/data.txt', 'r') as textfile:
lines = list(textfile)
words_all = sum([len(line.split()) for line in lines])
print 'Total words: ', words_all
在第二部分,似乎出現了問題。
words_par = 0 # You can leave out this line,
# 'words_par' is initialized in the for-statement
這里有更多問題:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
"P1" or "P2" or "P3"
評估為"P1"
(非空字符串是“真實”值)。 所以你可以縮短線路
if words_par.startswith("P1") & words_par.endswith("P1"):
這可能不是你想要的。
當條件求值為False時,不調用split方法,且words_par
仍為字符串(而不是預期的字符串列表)。 所以len(words_par)
返回字符數而不是字數。
(對名稱有點不滿:恕我直言,這個錯誤源於變量的不准確命名。不同的命名
for line in lines:
if line.startswith(...:
words_par = line.split()
print len(words_par)
會產生明確的錯誤信息。 在第二次閱讀中,無論如何,這一定是你的意思。)
第一部分是好的,你可以得到總單詞並打印結果。
你跌倒的地方就在這里
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
is at first a string containing the line from the file. 首先是一個包含文件行的字符串。 在永遠不會滿足的條件下,它會變成一個列表
line.split()
表達。 這個,如果表達的話
words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3")
永遠都會返回True,總是將文件的最后一行拆分,因為它的最后一次分配是在你的程序的第一部分中,你完全計算了文件中的單詞數。 那應該是真的
words_par.split()
也
words_par.startswith("P1" or "P2" or "P3")
一直會
words_par.startswith("P1")
以來
"P1" or "P2" or "P3"
始終計算到第一個是True,這是本例中的第一個字符串。 如果您想了解更多信息,請閱讀http://docs.python.org/reference/expressions.html 。
雖然我們在這里,除非你想做按位比較避免做
something & something
相反
something and something
第一個將評估兩個表達式,無論第一個表達式的結果如何,第二個表達式僅在第一個表達式為True時評估第二個表達式。 如果這樣做,您的代碼將更有效地運行。
該
print len(words_par)
在下一行總是要計算行中的字符數,因為if語句總是要求值為False,而word_par永遠不會被分成單詞列表。
無論序列是否為空,for循環上的else子句也將始終執行。 有關更多信息,請查看http://docs.python.org/reference/compound_stmts.html#the-for-statement 。
根據我的想法,我寫了一個我認為你所追求的版本。 我試圖保持簡單並避免使用列表理解之類的東西,因為你說你剛開始學習,所以它不是最優的,但希望很清楚。 另請注意,我沒有發表評論,所以請隨時麻煩我為你解釋一下。
words = None
with open('data.txt') as f:
words = f.read().split()
total_words = len(words)
print 'Total words:', total_words
in_para = False
para_count = 0
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', para_count
print ' '.join(paragraph)
para_count = 0
del paragraph[:]
para_type = word
else:
paragraph.append(word)
para_count += 1
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', para_count
print ' '.join(paragraph)
else:
print 'No words'
編輯:
我實際上只注意到示例中的一些冗余代碼。 不需要變量para_count,因為單詞被附加到段落變量。 而不是
print 'Words in paragraph', para_type, ':', para_count
你可以做到
print 'Words in paragraph', para_type, ':', len(paragraph)
少跟蹤變量。 這是更正的片段。
in_para = False
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
del paragraph[:]
para_type = word
else:
paragraph.append(word)
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
else:
print 'No words'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.