如果我有一个文件说一个img,我尝试通过一个生成器一次读取1个字节将文件分成14xx字节块,并将它们连接在一个变量中,为什么结果变量不是14xx字节?是因为python中变量的内部处理?如果有的话,除了让我的create_data函数返回另一个指示符之外,有什么方法可以测试我是否真的有14xx数据?
def split_file(self, filename):
with open(filename, "rb") as f:
while True:
byte = f.read(1)
if not byte:
break
yield(byte)
def create_data(self):
for x in range (1, 1472):
next_byte = split_file.filename
if not next_byte :
break
else:
msg = msg + split_file(self.filename)
return msg
curr_data = self.create_data
while sys.getsizeof(curr_data) == 1472:
# do something with curr_data
提前致谢
答案 0 :(得分:2)
您需要len()
,而不是sys.getsizeof()
。 sys.getsizeof()
包含Python对象的开销。您还会注意到它在容器(例如列表)上给出了“奇怪”的行为(即,可能不是您所期望的):它计算容器使用的内存,但不计算其中的对象。
答案 1 :(得分:1)
您可能希望使用实际以您希望的大小读取文件块的生成器:
def split_file(self, filename, size=1472):
with open(filename, "rb") as f:
while True:
buf= f.read(size)
if not buf:
break
yield(buf)
如果您这样做,则不需要对split_file
进行1472次调用,并在create_data
中进行1472个字符串追加。
然后你可以这样做:
for chunk in split_file(self.filename, self.size):
# if you want to discard the last chunk if len is less than size:
if len(chunk)<self.size:
break
#otherwise, deal with a chunk:
...
答案 2 :(得分:0)
在这种情况下,我只使用一个名为super_len
的函数,它适用于所有内容,我从请求的utils.py
文件中获取它:
def super_len(o):
if hasattr(o, '__len__'):
return len(o)
if hasattr(o, 'len'):
return o.len
if hasattr(o, 'fileno'):
try:
fileno = o.fileno()
except io.UnsupportedOperation:
pass
else:
return os.fstat(fileno).st_size
if hasattr(o, 'getvalue'):
# e.g. BytesIO, cStringIO.StringI
return len(o.getvalue())
如同善意所述,您需要使用len
代替sys.getsizeof
。 super_len
适用于我遇到的所有情况。