TXT 文件上的 Python 项目,如何读取字数和排序
Posted
技术标签:
【中文标题】TXT 文件上的 Python 项目,如何读取字数和排序【英文标题】:Python project on TXT file, how to read-count words-lines and sorting 【发布时间】:2020-04-26 23:16:21 【问题描述】:我有一个 .txt 文件。我需要从文本中删除所有不是字母的字符,然后打印其中有多少行字符。然后,我需要计算每个单词在文件中出现的次数,并将这些信息放入字典中。然后我需要打印前 3 个常用词和前 1000 个常用词。
我已经编写了这段代码,但它不能完成这项工作。有什么问题?
def word_count(path):
raws = 0
file = open(path, 'r')
while file.readline():
raws += 1
print ('There are', raws, 'raws in the TXT file')
file = open(path, 'r')
nchars = 0
nwords = 0
words = file.read().strip()
words = words.translate(str.maketrans('', '', string.punctuation))
for char in '#$%^&*-.:/()@\n1234567890;_':
words = words.replace(char, ' ')
words = words.lower()
word_list = words.split()
for word in word_list:
nwords += 1
for char in words:
nchars += 1
print ('There are', nwords, 'words in the TXT file')
print ('There are', nchars, 'characters in the TXT file')
def word_frequency(path):
dictionary =
file = open(path, 'r')
data = file.read()
data = data.translate(str.maketrans('', '', string.punctuation))
data = data.lower().split()
for word in data:
if not word[0] in '1234567890':
if word in dictionary:
dictionary[word] += 1
else:
dictionary[word] = 1
def most_appear_words(dictionary):
new_d = collections._OrderedDictValuesView
# new_d = sorted(dictionary)
print 'The three most apppear word in the TXT file are:'
for key in new_d:
print (key, new_d[key])
【问题讨论】:
你最后打电话给word_count
吗?你能告诉我们任何输出错误吗?
我遇到了“word_frequency”函数和“most_appear_words”函数的问题。我无法将所有他的话放在一个列表中并对列表进行排序,以便我可以打印最常见的 3 个单词
到目前为止,我设法编写的代码无法完成这项工作,以及第三个不起作用的功能。你能更具体一点吗?请提供minimal reproducible example。顺便说一句,我建议使用上下文管理器来处理文件对象。
有一些事情可以重做,例如 split() 生成一个列表并获取它的长度非常容易(您还可以看到字符串发生了什么)。有一个称为 set 的内置类型,它是唯一元素的无序集合。 string 内置类型有一个称为 count 的方法,用于计算字母或子字符串的出现次数。存储每个单词频率的字典方法很好。现在唯一剩下的(除了重构代码,因为你的文件是打开的)是使用 sorted() 使用列表理解按字典的值对字典进行排序
【参考方案1】:
说实话,您的代码存在多个问题。
您正在调用内置 open
三次。这意味着您的代码读取整个文件三次,而一次就足够了。每当您在执行file.read()
时,您都在尝试将整个文件读入内存。虽然这适用于小文件,但太大而无法放入内存的文件将导致 MemoryError
。
你的函数做的很多。他们
打开一个文件。 他们解析文件的内容。 他们打印计算出的统计数据。作为一般建议,函数和对象应遵循Single-responsibility principle。
目前您的代码根本不起作用,因为在您的函数most_appear_words
中缺少用于调用print
函数的括号。此外,您永远不应该导入任何名称以下划线开头的项目,例如collections._OrderedDictValuesView
。下划线表示此视图仅供内部使用。您可能想在此处导入collections.Counter
。
您没有提供最小的reproducible example。因此,不清楚您实际上是如何调用代码示例中的函数的。
但是,word_frequency
似乎缺少 return
语句。为了使您的代码按原样工作,您必须执行类似的操作
def word_frequency(path):
dictionary =
# <insert your code here that updates dictionary>
return dictionary
def most_appear_words(dictionary):
new_d = collections.Counter()
# <insert your code here that updates and prints new_d>
if __name__ == '__main__':
# <insert your code here>
# feed the return of word_frequency to most_appear_words:
d = word_frequency(your_path)
most_appear_words(d)
我希望这将帮助您使您的代码正常工作。
但请注意,我建议采用不同的方法:
有一个函数负责打开和处理文件 (word_iterator
)。
有一个负责统计的功能,即计算单词和字母 (word_count
)。
有一个功能可以将结果打印到控制台 (print_statistics
)。
我建议的任务解决方案是:
from collections import Counter
import string
def word_iterator(fp):
t = str.maketrans('', '', string.punctuation + string.digits)
word_no = 0
with open(fp) as in_file:
for line_no, line in enumerate(in_file, start=1):
line = line.translate(t)
words = line.split()
for w in words:
word_no += 1
yield line_no, word_no, w.lower()
def word_count(word_iter):
words = Counter()
line_no = 0
word_no = 0
n_chars = 0
for line_no, word_no, word in word_iter:
n_chars += len(word)
words.update([word])
result =
'n_lines': line_no,
'n_words': word_no,
'n_chars': n_chars,
'words': words
return result
def print_statistics(wc, top_n1=3, top_n2=None):
print(' Word Count '.center(20, '='))
print(f'File fn consists of')
print(f' wc["n_lines"]:5 lines')
print(f' wc["n_words"]:5 words')
print(f' wc["n_chars"]:5 characters')
print()
print(' Word Frequency '.center(20, '='))
print(f'The top_n1 most frequent words are:')
for word, count in wc['words'].most_common(top_n1):
print(f' word (count times)')
if top_n2:
print()
print(f'The top_n2 most frequent words are:')
top_words = [w for w, _ in wc['words'].most_common(top_n2)]
print(', '.join(top_words))
if __name__ == '__main__':
fn = 'text_file.txt'
stat = word_count(word_iterator(fn))
print_statistics(stat, top_n1=3, top_n2=1000)
带有样本输出
==== Word Count ====
File text_file.txt consists of
7 lines
104 words
492 characters
== Word Frequency ==
The 3 most frequent words are:
a (5 times)
the (4 times)
it (3 times)
The 1000 most frequent words are:
a, the, it, content, of, lorem, ipsum, and, is, that, will, by, readable, page, using, as, here, like, many, web, their, sometimes, long, established, fact, reader, be, distracted, when, looking, at, its, layout, point, has, moreorless, normal, distribution, letters, opposed, to, making, look, english, desktop, publishing, packages, editors, now, use, default, model, text, search, for, uncover, sites, still, in, infancy, various, versions, have, evolved, over, years, accident, on, purpose, injected, humour
【讨论】:
以上是关于TXT 文件上的 Python 项目,如何读取字数和排序的主要内容,如果未能解决你的问题,请参考以下文章
我如何从网络托管机器人上的不和谐聊天中读取 txt 文件中的原始文本