Python TypeError问题'int'不能使用带链的列表进行迭代

时间:2016-05-23 16:59:28

标签: python arrays

我在Python中遇到了一个奇怪的错误。我使用chain命令来压缩数据数组,然后使用list命令将其放回数组中。但是,根据我如何定义数组,它会给我一个错误。我想要的是这样的东西

import os, io, struct, array
from itertools import chain


#Open file and set the size of the data for use later
file=open('filePath','rb')
size = os.fstat(file.fileno()).st_size
count = int(size)

#Initializing an array with length to match the data
dataArray=[0]*count


#storing the values of data 4 bytes at a time to produce the numeric values. 
for i in range(0,count,4):
    dataArray[i]=struct.unpack('i', file.read(4))

#Deals with a tuple issue ((x,),(y,),...) -> (x,y,...)
dataArray = list(chain(*dataArray[:count]))

这从最后一行给我TypeError: 'int' object is not iterable。但是,如果我说的话

count = 33638664
myarray=[0]*count


for i in range(3638664):
    myarray[i]=struct.unpack('i', file.read(4))


result = list(chain(*myarray[:3638664]))

我没有收到这样的错误。请注意,在第二段代码中,链方法3638664中的值小于count。如果我将其设置为count长度,则会产生错误。这是某种索引或计数问题吗?我不确定为什么我的原始代码会出现这种错误,而不是这个任意count值代码。

1 个答案:

答案 0 :(得分:1)

您正在使用dataArray解包*dataArray[:count]。这会导致chain尝试迭代dataArray的每个元素,但它不能,因为(如错误所示),它不能迭代整数。因此,当它命中dataArray的元素时,它是一个int而不是一个元组,它会中断。

你也在做一些非常奇怪的事情,用初始循环来读取文件。没有理由像这样预先初始化列表。你可以这样做,它也会做同样的事情。我也不明白为什么你要缩短到count长度,最多只有count/4个条目。

import os, io, struct, array
from itertools import chain


#Open file and set the size of the data for use later
file = open('file','rb')
size = os.fstat(file.fileno()).st_size
count = int(size)
data_array = [struct.unpack('i', file.read(4)) for _ in range(0,count,4)]

#Deals with a tuple issue ((x,),(y,),...) -> (x,y,...)
data_array = list(chain(*data_array))
print(data_array)

这里也没有充分的理由使用chainstruct.unpack的格式字符串将始终返回一个项目,因此您只需执行dataArray = [struct.unpack('i', file.read(4))[0] for _ in range(0,count,4)]

您还应该使用with来处理文件。

最后,没有理由做count = int(size)size已经是一个int。因此,最终的简化代码如下所示:

import os
import struct

with open('file','rb') as file:
    size = os.fstat(file.fileno()).st_size
    dataArray = [struct.unpack('i', file.read(4))[0] for _ in range(0,size,4)]
print(dataArray)