2016-01-13 22 views
5

Recentemente ho incontrato il metodo readinto dell'oggetto file (in Python 2.7), è simile a fread in C. Sembra in alcuni casi comodo e potente. Ho intenzione di usarlo per leggere diversi file in un array numerico pre-assegnato senza dati copiati.Dovrei usare il metodo `readinto` del file python o no?

ad es.

a = np.empty(N) 
b = memoryview(a) 
fp1.readinto(b[0:100]) 
fp2.readinto(b[100:200]) 

e

fp1.readinto(b[0:100]) 
fp1.seek(400, 1) 
fp1.readinto(b[100:200]) 

Ho usato Cython e fread per fare questo prima di incontrare readinto. Quindi sono molto felice di conoscere una soluzione Python pura.

Tuttavia la sua stringa di documento dice,

file.readinto? 
Type:  method_descriptor 
String form: <method 'readinto' of 'file' objects> 
Namespace: Python builtin 
Docstring: readinto() -> Undocumented. Don't use this; it may go away. 

Non usare questo? Cos'è successo?

Quindi sono confuso, dovrei usare readinto o no? Può causare problemi indesiderati?

Esiste un'implementazione alternativa per il codice precedente senza readinto ma anche evitare la copia dei dati? (Per evitare la copia significa np.concatenate o np.stack non è una buona scelta.)

Qualsiasi suggerimento è il benvenuto! Grazie.

------- ------- upate

Sembra che posso usare io.FileIO nella libreria standard anziché la funzione build-in open. Sembra OK quindi ho pubblicato come risposta.

Qualsiasi commento o altra soluzione è ancora benvenuto!

upate ------- -------

Se si incontra lo stesso problema, si consiglia di avere uno sguardo ai commenti qui sotto per
Andrea Corbellini e Padraic Cunningham.

+0

Potrebbe rispondere alla tua domanda http://stackoverflow.com/questions/9791780/readinto-replacement –

+0

@AndreaCorbellini Basta digitare 'file.readinto?' In IPython , questo è equivalente a 'help (file.readinto)' nella shell python standard. Ho controllato altri metodi 'file' come hai detto tu, ma solo' readinto' mostra questo messaggio. –

+1

Vuoi forse memmap? Http: //docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.memmap.html –

risposta

2

È possibile utilizzare io.FileIO nella libreria standard python invece della funzione di build open o file, se non si è sicuri con file.readinto.

Ecco il docstring:

#io.FileIO.readinto? 
Type:  method_descriptor 
String form: <method 'readinto' of '_io.FileIO' objects> 
Docstring: readinto() -> Same as RawIOBase.readinto(). 

Il documento di io.RawIOBase.readinto può essere trovato here.

classe io.RawIOBase

...

readinto (b)

leggere fino a len (b) byte in ByteArray B e restituire il numero di byte letti. Se l'oggetto è in modalità non bloccante e non sono disponibili byte, viene restituito Nessuno.

E 'disponibile sia in Python 2 e 3.