2012-01-02 5 views
17

Sto cercando di imparare ad usare il modulo pickle in Python:L'utilizzo di pickle.dump in Python

import pickle 
x = 123 
f = open('data.txt','w') 
pickle.dump(x,f) 

Ecco quello che ottengo:

Traceback (most recent call last): 
    File "D:\python\test.py", line 5, in <module> 
    pickle.dump(x,f) 
TypeError: must be str, not bytes 

Tuttavia, questo codice funziona solo bene:

import pickle 
dump = pickle.dump(123) 
print(dump) 


che cosa sto facendo di sbagliato?

+0

Solo qualcosa degno di nota: per tutte le modalità di file in Python, si dovrebbe aggiungere un ' 'b'' alla fine della stringa, anche se è solo'' rb'' , dal momento che è indipendente dalla piattaforma. – Edwin

+0

@Edwin: Non esegue traslitterazioni newline specifiche della piattaforma, ma in 3.x c'è una differenza importante: i file aperti in modalità binaria gestiscono solo byte, i file aperti in modalità testo gestiscono solo il testo ("unicode"). Mentre la modalità binaria ha sicuramente senso per i dati binari e la modalità testo potrebbe non essere applicabile in alcuni altri casi, il tuo suggerimento è troppo generico. Se decidi di decodificare i byte in testo, l'apertura in modalità binaria di solito non ha senso. È più semplice e robusto lasciare che Python lo gestisca, ed è meglio indovinare le codifiche piuttosto che le codifiche hardcoding. – delnan

+0

@delnan Ah, ok; Mi sono appena ricordato di averlo letto da qualche parte sul sito python.org. – Edwin

risposta

30

Il problema è che si sta aprendo il file in modalità testo. È necessario utilizzare binario qui:

>>> f = open('data.txt','w') 
>>> pickle.dump(123,f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: must be str, not bytes 
>>> 
>>> f = open('data.txt','wb') 
>>> pickle.dump(123,f) 
>>> 
+0

non ho ricevuto alcun errore con 'w', ha funzionato bene !!! –

+3

@SrinivasReddyThatiparthy: stavi usando Python 3? Le cose sono cambiate. – DSM

+0

@DSM, ho cambiato 'w' in 'wb' - ha funzionato per me, grazie! – Sergey

1

Il metodo di scrittura per oggetti di tipo file accetta solo un argomento di stringa singola. Il metodo dumps nel modulo pickle esegue automaticamente gli argomenti come stringhe, mentre il metodo dump scriverà una rappresentazione decapitata dell'oggetto nel file aperto. Poiché 123 non è una stringa, genera l'errore TypeError.

Questo è confermato in pickle.dump documentation.

+0

Questo capisco, ma perché non funziona il primo pezzo di codice (quello con pickle.dump)? – Sergey

+0

Poiché il metodo di scrittura sull'oggetto file accetta solo un argomento a stringa singola. – garnertb