我在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
值代码。
答案 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)
这里也没有充分的理由使用chain
。 struct.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)