gpt4 book ai didi

python - 为什么 fsize 变量在全局时被清除?

转载 作者:行者123 更新时间:2023-11-28 22:39:36 25 4
gpt4 key购买 nike

我正在尝试用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com