Найти - Пользователи
Полная версия: Запись и чтение из бинарного файла.
Начало » Python для новичков » Запись и чтение из бинарного файла.
1 2
nauman
knkd, спасибо.

Вариант №1:
#!/usr/bin/python
import hashlib

#пишем в файл
pwd=hashlib.md5('password').hexdigest()
D={'name': pwd}
print D
pass_file=open('c:\\Python26\\passwd.txt','w')
str1=''.join('%s:%s' % item for item in D.items())
edata = str1.encode('bz2').encode('hex')
pass_file.write(edata)
pass_file.close()

#читаем из файла
pass_file=open('c:\\Python26\\passwd.txt','r')
ddata = pass_file.readline().decode('hex').decode('bz2')
L=ddata.split(':')
D={L[0]: L[1]}
pass_file.close()
print D
Ed
Все просто чудесно за исключением того, что D в конце вашей программы не словарь, а строка.
nauman
Ed
Все просто чудесно за исключением того, что D в конце вашей программы не словарь, а строка.
:-) Не обратил внимания, спасибо. Пока так исправил, в моем предыдущем посте.
nerijus
По моему для записи строки на файл луче и безопаснее использовать простой read/write вместо cPickle. А для конвертации str -> dict посмотри на ast.literal_eval (http://docs.python.org/library/ast.html).
nauman
Второй вариант:
#!/usr/bin/python
import ast, hashlib

#пишем в файл
pwd=hashlib.md5('password').hexdigest()
D={'name': pwd}
print D
pass_file=open('c:\\Python26\\passwd.txt','wb')
edata = str(D).encode('bz2').encode('hex')
pass_file.write(edata)
pass_file.close()

#читаем из файла
pass_file=open('c:\\Python26\\passwd.txt','rb')
ddata = pass_file.readline().decode('hex').decode('bz2')
pass_file.close()
D=ast.literal_eval(ddata)
print D
Ed
А по-моему что cPickle, что ast в данном конкретном случае - извращение. Достаточно тупо записать в файл закодированые имена и пароли по паре на строку, разделив пробелом и потом прочитать их, положив в словарь или куда надо.
Использовать для этого стороннюю библиботеку - оверкил.
nerijus
И cPickle, и ast не сторонние библиотеки, и никакого overkill я тут невижу (cPickle только не безопасен). А концептуально пароль хранить в файле плохо, но по моему это уже offtopic.
Ed
С ast я погорячился, признаю. Просто 2.4 был под рукой - в нем не было (кстати, это еще один минус).
Насчет оверкила не согласен. Использовать ast для словаря из двух полей - однозначно оверкил.
Без него как минимум код будет проще и понятнее.
knkd
Ed
Без него как минимум код будет проще и понятнее.
Можно например, как-то так, но я не уверен что это сделало код понятнее :)
In [00]: username = 'knkd'
In [01]: password = 'MyPasswd'
In [02]: string = 'password\x00{0}\xffusername\x00{1}'.format(password, username)
...
In [77]: decode = dict([(y for y in x.split('\x00')) for x in string.split('\xff')])
In [78]: print decode
-> {'username': 'knkd', 'password': 'MyPasswd'}
knkd
Можно ещё шифровать шифром Виженера (по зашитому ключу), но это уже из категории “Остапа понесло” :)
In [00]: import itertools as it
In [01]: username = 'knkd'
In [02]: password = 'MyPasswd'
In [03]: key = 'Abrakadabra'
In [04]: string = 'password\x00{0}\xffusername\x00{1}'.format(password, username)
In [05]: encode = lambda key,message: ''.join(it.imap( lambda (x,y): ((ord(x)+ord(y)<=255) and chr(ord(x)+ord(y))) or chr((ord(x)+ord(y))%255), it.izip(it.cycle(key),message)))
In [06]: decode = lambda key,data: ''.join(it.imap( lambda (x,y): ((ord(y)-ord(x)>=0) and chr(ord(y)-ord(x))) or chr((255+(ord(y)-ord(x)))%255), it.izip(it.cycle(key),data)))
In [07]: data = encode(key, string)
In [08]: print data
-> '\xb1\xc3\xe5\xd4\xe2\xd0\xd6\xc5b\xbf\xda'
In [09]: repr(decode(key, data))
-> "'password\\x00MyPasswd\\x00username\\x00knkd'"
P.S. Не уверен что это работает правильно во всех случаях :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB