如何计算段落中的字数并从文件中排除某些字词?

2024-04-27 12:58:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学Python,所以我的问题可能有点傻。我正在尝试创建一个程序:
-导入文本文件(已获取)
-计算单词总数(得到它),
-从特定短语(例如“P1”,以另一参与者“P2”结尾)开始计算特定段落中的单词数,并将这些单词从我的单词数中排除。不知怎的,我最终得到了一些计算字符数的东西:/
-单独打印段落(明白)
-从我的字数中排除“P1”“P2”等单词。

我的文本文件如下:
P1:Bla-Bla-Bla。
第2页:废话废话。
P1:布拉布拉。
P3:布拉。

我最终得到了这个密码:

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'

有什么改进的办法吗?

谢谢


Tags: ortextlineall单词段落wordslines
4条回答

第一部分是好的,你可以得到总单词和打印结果。

你摔倒的地方在这里

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'

单词最初是一个包含文件行的字符串。在一个永远无法满足的条件下,它被变成一个

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

无论第一个表达式的结果如何,第一个表达式都将对两个表达式求值,而第二个表达式仅在第一个表达式为真时才求值。如果您这样做,您的代码将更有效地运行。

那个

print len(words_par)

下一行总是要计算行中的字符数,因为if语句的值总是为False,而单词_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'

第一部分是好的,你可以得到总单词和打印结果。

你摔倒的地方在这里

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'

单词最初是一个包含文件行的字符串。在一个永远无法满足的条件下,它被变成一个

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

无论第一个表达式的结果如何,第一个表达式都将对两个表达式求值,而第二个表达式仅在第一个表达式为真时才求值。如果您这样做,您的代码将更有效地运行。

那个

print len(words_par)

下一行总是要计算行中的字符数,因为if语句的值总是为False,而单词_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'

也许我不完全理解这些要求,但我会尽力的。

第一部分是所有单词的计数。我会把它缩短一点:

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"(非空字符串是“truthy”值)。所以你可以把线缩短到

    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)

会产生一个清晰的错误信息。在第二次阅读中,这一定是你的意思。)

您不应该使用标识符文本调用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")总是False,因此不会执行所需的拆分。

因此,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() 

相关问题 更多 >