作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 python 计算文件的香农熵。
因此,我编写了以下代码来实现这一点。但它没有按预期工作。
我认为一切正常,但是 fsize 变量被清除了。
我不明白为什么,因为它拥有全局范围。
你能帮忙或解释一下吗?
谢谢
from __future__ import division
import sys
import os
import math
def get_chunks(file_size, chunk_size = 4096):
chunk_start = 0
while chunk_start + chunk_size < file_size:
yield(chunk_start, chunk_size)
chunk_start += chunk_size
final_chunk_size = file_size - chunk_start
yield(chunk_start, final_chunk_size)
def read_file_chunked(file_path):
file_size = os.path.getsize(file_path)
fsize = file_size # <------------------------------this var
print('File size: {}'.format(file_size))
with open(file_path,'rb') as file_:
progress = 0
for chunk_start, chunk_size in get_chunks(file_size):
file_chunk = file_.read(chunk_size)
# byte count
for b in file_chunk:
freqs[ord(b)]+=1
progress += len(file_chunk)
print '{0} of {1} bytes read ({2}%)'.format( progress, file_size, int(progress / file_size * 100))
#calculate the frequency of each byte
for idx, f in enumerate(freqs):
freqs[idx] = float(f / file_size)
print
freqs = [0] * 256
fsize = 0 #<------------------ this var
if len(sys.argv) != 2:
print "Usage entropy [file]"
sys.exit()
if __name__ == '__main__':
read_file_chunked(sys.argv[1])
# print byte frequencies
for idx,f in enumerate(freqs):
print hex(idx),f
# calculate Shannon entropy
ent = 0.0
for f in freqs:
if f > 0:
ent += f * math.log(f,2)
ent = -ent
print 'Shannon entropy ( min bits per byte-character )'
print ent
print
print 'Min possible file size assuming max compression efficiency'
print (ent * fsize), ' in bits' #------------------- here fsize is 0
print (ent * fsize) / 8, ' in bytes' #-------------- here fsize is 0
最佳答案
在您的 read_file_chunked
函数中,您正在函数范围内创建一个新变量 fsize
,您根本没有修改您的全局变量。考虑以下演示:
>>> x = 0
>>> def foo():
... x = 1
...
>>> foo()
>>> x
0
要使该段代码按您预期的方式工作,您缺少的是 global
关键字:
>>> x = 0
>>> def foo():
... global x
... x = 1
...
>>> foo()
>>> x
1
话虽如此,我质疑您对全局变量的使用。你为什么不从你的函数中return
fsize
?
关于python - 为什么 fsize 变量在全局时被清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578974/
我正在尝试用 python 计算文件的香农熵。 因此,我编写了以下代码来实现这一点。但它没有按预期工作。 我认为一切正常,但是 fsize 变量被清除了。 我不明白为什么,因为它拥有全局范围。 你能帮
我是一名优秀的程序员,十分优秀!