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 项目,如何读取字数和排序的主要内容,如果未能解决你的问题,请参考以下文章

使用Python读取markdown文件并统计字数

python 读取文件

我如何从网络托管机器人上的不和谐聊天中读取 txt 文件中的原始文本

如何在python中从txt文件中读取数据[重复]

Python 3 无法读取我的 .txt 文件。我该如何解决? [复制]

如何在python中读取文件时将值组合在一起