我正在尝试使用python来读取一个简短的文本文件,通过删除标点符号(:,。!?)来清理它,并查找行数和单词数。我创建的文件有3行,但在我删除标点后它显示有5行...我做错了什么?请帮忙。这是我的
[{0}]{1}{2}
答案 0 :(得分:1)
您的代码存在一些问题。
具体来说,没有参数的方法split()
会在任何空白而不是行边界上拆分字符串。 splitlines()
会分开。
另外您的代码:
word_count += len(wordslist)
将单词列表的长度添加到wordslist
的每个元素的单词计数中。这几乎绝对不是你想要的!
另请注意您的代码:
for char in ': , . ! ?':
data = data.replace(char,' ')
用空格替换提供的字符串(': , . ! ?':'
)中的每个字符。但是,因为您的字符串本身包含空格,所以您将data
中的所有空格替换为空格4次。它不会改变结果,但会降低你的代码效率。
相反,您可以使用以下代码获得更正确的结果:
with open('book.txt','r') as file:
data = file.read()
for char in ':,.!?':
data = data.replace(char,' ')
word_count = len(data.split()) #count of words separated by whitespace
line_count = len(data.splitlines()) #count of lines in data
print(word_count,line_count)
<强>附录强>
评论中还询问了如何获得字符数。假设字符计数应该计算所有不是空格的字符(制表符,换行符等)或特殊字符列表,那么可以使用正则表达式来完成:
import re
#original code that stripped out punctuation here
chars_only = re.sub(r"\s+", "", data, flags=re.UNICODE)
char_count = len(chars_only)
re.sub
执行正则表达式替换,替换与表达式r"\s+"
匹配的字符(相当于&#34;所有空白字符&#34; )第二个参数 - 在这种情况下为空字符串。
但是,应该注意的是,此char_count
将包含原始特殊标点符号列表中的标点字符(例如撇号)。
答案 1 :(得分:0)
你可以试试这个:
word_count = 0
line_count = 0
with open('sample1.txt','r') as file:
data = file.readlines()
for line in data:
if '?,!:.' in line:
data = line.strip('?,!@')
for line in data:
line_count += 1
word_count += len(line.split(' '))
print(word_count, line_count)
说明:
此处strip()
会删除我们不需要的字符。
使用readlines
将读取所有行并以列表格式输入。
for line in data:
if '?,!:.' in line:
data = line.strip('?,!@')
在这里,您将在每一行中进行迭代,并检查每行?:.,
是否存在。如果它在那里你正在剥离它。
for line in data:
line_count += 1
word_count += len(line.split(' '))
在这里,您将遍历每一行,并按line_count +=1
计算行数word_count += len(line.split(' '))
和word_count,并使用空格作为分隔符将行拆分为单词。
答案 2 :(得分:0)
.split()
实际上并没有像你预期的那样使用直线。您需要.splitlines()
word_count = 0
line_count = 0
with open('books.txt','r') as file:
data = file.read()
for line in data:
if '?,!:.' in line:
data = line.strip('?,!@')
#Here is the part you need
wordslist = data.splitlines()
for line in wordslist:
line_count += 1
word_count += len(line.split())
print(word_count, line_count)
或者你可以使用.split('\n')
做同样的工作。