为什么包含1472字节文件的变量的字节大小不同

时间:2013-10-27 18:00:02

标签: python

如果我有一个文件说一个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

提前致谢

3 个答案:

答案 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.getsizeofsuper_len适用于我遇到的所有情况。