строка кодирования - PullRequest
       15

строка кодирования

2 голосов
/ 21 августа 2011

«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.'

Как мне кодировать, чтобы получить тот же hexdigest обратно из этих байтов ?? Кроме того, я получаю несколько бессмысленных символов в syncDb.txt, таких как «€ X» после каждой строки. Как правильно записать данные в удобочитаемой форме ??

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

Вам необходимо распаковать данные:

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 следует использовать с более сложными структурами, такими как массивы, dict или даже классы.

1 голос
/ 21 августа 2011

Не pickle hexdigest, просто запишите его в виде текста.

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 чтобы прочитать данные обратно из файла.

...