2016-05-23 8 views
0

Ich renne in Python in einen seltsamen Fehler. Ich benutze den chain Befehl, um ein Array von Daten und dann den list Befehl zu flattern, um es in ein Array zurückzulegen. Abhängig davon, wie ich das Array definiere, bekomme ich einen Fehler. Was ich möchte, ist so etwas wie diesPython TypeError Problem 'int' nicht iterierbar mit Liste mit Kette

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])) 

Das ist mir TypeError: 'int' object is not iterable aus der letzten Zeile gibt. Wenn ich jedoch etwas wie

count = 33638664 
myarray=[0]*count 


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


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

sage, erhalte ich keinen solchen Fehler. Beachten Sie, dass in diesem zweiten Codeabschnitt der Wert in der Kettenmethode 3638664 kleiner als count ist. Es wird einen Fehler erzeugen, wenn ich es auf die Länge count setze. Ist das eine Art von Indizierung oder Zählen? Ich bin nicht sicher, warum ich diese Art von Fehler für meinen ursprünglichen Code und nicht für diesen willkürlichen count Wertcode erhalte.

+0

Dies benötigt ein [MCVE]. Wie es ist, werfen beide Versionen des Codes den gleichen Fehler für mich. –

Antwort

1

Sie entpacken dataArray mit *dataArray[:count]. Dies führt dazu, dass chain versucht, über jedes Element von dataArray zu iterieren, aber das kann nicht, weil es (wie der Fehler sagt) nicht über eine Ganzzahl iterieren kann. Wenn es also ein Element von dataArray trifft, das ein Int anstelle eines Tupels ist, bricht es.

Sie machen auch einige sehr seltsame Sachen mit der ersten Schleife, um die Datei einzulesen. Es gibt keinen Grund, die Liste so vorzufinanzieren. Du kannst das einfach tun, und es wird das Gleiche tun. Ich verstehe auch nicht, warum Sie auf count Länge abschneiden, wenn es höchstens count/4 Einträge gibt.

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) 

Es gibt auch keinen Grund, chain hier zu verwenden. Ihre Formatzeichenfolge für struct.unpack wird immer ein Element zurückgeben, so dass Sie einfach dataArray = [struct.unpack('i', file.read(4))[0] for _ in range(0,count,4)] tun können.

Sie sollten auch with verwenden, um Dateihandling zu tun.

Schließlich gibt es keinen Grund, count = int(size) zu tun. size ist bereits ein int. So würde der endgültige vereinfachte Code wie folgt aussehen:

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) 
+0

Das hat den Trick! Vielen Dank! – Lou

+0

@ user99264 Großartig, froh, ich könnte helfen! –

Verwandte Themen