【问题标题】:Read .txt file and analyze读取 .txt 文件并分析
【发布时间】:2013-09-11 16:14:32
【问题描述】:

我正在对任何 .txt 文件进行 Huffman 编码,所以首先我需要分析这个文本文件。我需要阅读它,然后分析。 我需要像表格一样“退出”:


信 |频率(后面重复多少次)|霍夫曼代码(稍后会出现)


我开始:

 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))

但是编译器返回一个“错误” 在此输入代码

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

【问题讨论】:

  • 对重新标记此作业有任何异议吗?
  • 我看到你尝试的问题。最后两行有一个前导空格字符,并且没有import collectionsimport operator 语句。修复这些,它应该可以正常工作。
  • 你是什么意思你需要他们在for循环中按字母顺序排列?这没有任何意义。您必须一次读取所有文件,然后在循环之前对其进行排序。这增加了什么?

标签: python huffman-code


【解决方案1】:

要获取您的频率表,我会使用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))

【讨论】:

  • 这基本上是我自己编写 Huffman 实现时的做法。 (除了我的文字“符号”不是单个字符......;))
  • @thaking,我真的不太了解 Python。您最好创建一个新问题,以便专家可以看到它。
【解决方案2】:
with open('test.txt') as f: data = f.read()
table = dict((c, data.count(c)) for c in set(data))

【讨论】:

  • 为了清楚起见,这将对文件中出现的每个字符迭代一次data
  • 还有一个额外的时间来创建集合。它是为整洁而不是效率而设计的。
【解决方案3】:

我使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多