2011-08-21 145 views
2

「afile」是以前存在的文件。編碼字符串

handle=open("afile",'r+b') 
data=handle.readline() 
handle.close() 
# signgenerator is a hashlib.md5() object 

signgenerator.update(data)  
hex=signgenerator.hexdigest() 
print(hex) # prints out 061e3f139c80d04f039b7753de5313ce 

,寫這一個文件

f=open("syncDB.txt",'a') 
#hex=hex.encode('utf-8') 
pickle.dump(hex,f) 
f.close() 

但是,當我讀迴文件

while True: 
    data=f.readline() 
    print(data) 

這使輸出:

b'\x80\x03X \x00\x00\x00061e3f139c80d04f039b7753de5313ceq\x00.\x80\x03X \x00\x00\x00d9afd4bb6bc57679f6b10c0b9610d2e0q\x00.\x80\x03X \x00\x00\x008b70452c46285d825d3670d433151841q\x00.\x80\x03X \x00\x00\x00061e3f139c80d04f039b7753de5313ceq\x00.\x80\x03X \x00\x00\x00d9afd4bb6bc57679f6b10c0b9610d2e0q\x00.\x80\x03X \x00\x00\x008b70452c46285d825d3670d433151841q\x00.\x80\x03X \x00\x00\x00b857c3b319036d72cb85fe8a679531b0q\x00.\x80\x03X \x00\x00\x007532fb972cdb019630a2e5a1373fe1c5q\x00.\x80\x03X \x00\x00\x000126bb23767677d0a246d6be1d2e4d5cq\x00.' 

我該怎麼辦編碼以獲得相同的十六進制從這些字節? 另外我在syncDb.txt中得到了一些亂碼字符,比如每行之後的「€X」。如何正確地以可讀形式寫入數據?

回答

2

您需要unpickle數據:

pickle.load(open('syncDB.txt', 'r+b')) 

你有什麼有醃製的數據。證明:

>>> import pickle

>>> pickle.loads(b'\x80\x03X \x00\x00\x00061e3f139c80d04f039b7753de5313ceq\x00.\x80\x03X \x00\x00\x00d9afd4bb6bc57679f6b10c0b9610d2e0q\x00.\x80\x03X \x00\x00\x008b70452c46285d825d3670d433151841q\x00.\x80\x03X \x00\x00\x00061e3f139c80d04f039b7753de5313ceq\x00.\x80\x03X \x00\x00\x00d9afd4bb6bc57679f6b10c0b9610d2e0q\x00.\x80\x03X \x00\x00\x008b70452c46285d825d3670d433151841q\x00.\x80\x03X \x00\x00\x00b857c3b319036d72cb85fe8a679531b0q\x00.\x80\x03X \x00\x00\x007532fb972cdb019630a2e5a1373fe1c5q\x00.\x80\x03X \x00\x00\x000126bb23767677d0a246d6be1d2e4d5cq\x00.') '061e3f139c80d04f039b7753de5313ce'

但有醃製一個十六進制字符串是沒有意義的。你可以把它放在文件中。 pickle模塊應該用於更復雜的結構,如數組,字典甚至是類。

+0

很確定你應該總是以二進制模式打開'pickle'd文件。 – agf

+0

@agf erm ..是的,對不起 –

+0

非常感謝。我還有很多東西要學。 – Sankalp

1

不要pickle十六進制,只是將它寫出來作爲文本。

with open("afile",'rb') as handle: 
    data=handle.readline() 

signgenerator.update(data) 
hex=signgenerator.hexdigest() 

with open("syncDB.txt",'ab') as f: 
    f.write(hex + '\n') 

with open("syncDB.txt",'rb') as f: 
    for data in f: 
     print(data) 

如果你真的想使用pickle,您需要使用pickle.load function讀取數據從文件回來。

+0

f.write(hex +'\ n') TypeError:'str'不支持緩衝接口 – Sankalp

+0

您應該指定您是否在Python 3上 - 我的代碼在2上工作。您需要'hex .encode()'並使用'b'\ n'來將unicode轉換爲Python 3中的字節。 – agf