读取.txt文件并分析

0 投票
3 回答
10578 浏览
提问于 2025-04-16 08:03

我正在做霍夫曼编码,目标是处理任何 .txt 文件,所以我首先需要分析这个文本文件。我需要先读取它,然后进行分析。

我需要一个像这样的“退出”表格:


字母 | 频率(同一个字母出现了多少次) | 霍夫曼编码(这个稍后会加上)


我开始时写了:

 f = open('test.txt', 'r')    #open test.tx
 for lines in f:
     print lines          #to ensure if all work...

我该如何按字母顺序读取文件中的字符呢:

with open("test.txt") as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1

???非常感谢


Well I tried like this:
frequencies = collections.defaultdict(int)
with open("test.txt") as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1


 frequencies = [(count, char) for char, count in frequencies.iteritems()]
 frequencies.sort(key=operator.itemgetter(1))

但是编译器给我返回了一个“错误”

我需要这个字母顺序在循环中,而不是在频率统计结束时...

3 个回答

0

我用一个叫 collections.Counter() 的工具做了这个解决方案:

import re
import collections


if __name__ == '__main__':
    is_letter = re.compile('[A-Za-z]')

    frequencies = collections.Counter()
    with open(r'text.txt') as f_in:
        for line in f_in:
            for char in line:
                if is_letter.match(char):
                    frequencies[char.lower()] += 1

    # Sort characters 
    characters = [x[0] for x in frequencies.most_common()]
    characters.sort()
    for c in characters:
        print c, '|', str(frequencies[c])

这里的正则表达式 is_letter 用来筛选我们感兴趣的字符。 它的输出结果看起来像这样。

a | 177
b | 29
c | 7
d | 167
e | 374
f | 58
g | 100
h | 44
i | 135
j | 21
k | 64
l | 125
m | 85
n | 191
o | 105
p | 34
r | 185
s | 130
t | 146
u | 34
v | 68
x | 1
y | 14
0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这就像是从一个箱子里拿东西,然后把它放到另一个箱子里。

有些时候,我们会用到“变量”。变量就像是一个可以存放东西的盒子,你可以把数据放进去,也可以随时拿出来查看或修改。比如,你可以把一个数字放进变量里,然后在需要的时候再用这个数字。

在编程中,我们还会用到“函数”。函数就像是一个小工具箱,里面有一些特定的工具,可以帮助我们完成某个任务。你只需要告诉这个工具箱你想要做什么,它就会帮你完成。

总之,编程就是通过这些“盒子”和“工具”来处理和管理数据,让计算机按照我们的想法去做事情。

with open('test.txt') as f: data = f.read()
table = dict((c, data.count(c)) for c in set(data))
2

要得到你的频率表,我建议使用一个叫做 defaultdict 的东西。这样的话,你只需要遍历数据一次就可以了。

import collections
import operator

frequencies = collections.defaultdict(int)
with open(filename) as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1


frequencies = [(count, char) for char, count in frequencies.iteritems()]
frequencies.sort(key=operator.itemgetter(1))

撰写回答