txt - guardar una lista en un archivo python
Hashing un archivo en Python (5)
Quiero que Python lea el EOF para que pueda obtener un hash apropiado, ya sea sha1 o md5. Por favor ayuda. Esto es lo que tengo hasta ahora:
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
Abra el archivo en modo binario, el modo predeterminado de open()
es ''r''
que es "abierto para leer en modo texto". En el modo de texto, la conversión de nueva línea se realiza en sus datos, esto puede causar errores específicos de la plataforma también, pero un posible problema que puede ocurrir como resultado del modo de texto es que las secuencias ''/ r / n'' se reemplazan por ''/ n'' en el cadena que llega a sus manos. No todos los archivos contienen secuencias ''/ r / n'', especialmente en el caso de archivos binarios, por lo que el error no vendría todo el tiempo y sería difícil atraparlo.
openedFile = open(inputFile, ''rb'')
Aquí hay otro pequeño problema: lees el archivo en una gran porción, leyéndolo en trozos más pequeños de kilobytes podrías copiar archivos muy grandes incluso si no encajaran en tu memoria disponible.
He programado un módulo que es capaz de cortar grandes archivos con diferentes algoritmos.
pip3 install py_essentials
Usa el módulo así:
from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
Para el cálculo correcto y eficiente del valor hash de un archivo (en Python 3):
- Abra el archivo en modo binario (es decir, agregue
''b''
al modo de archivo) para evitar la codificación de caracteres y problemas de conversión de final de línea. - No lea el archivo completo en la memoria, ya que eso es una pérdida de memoria. En su lugar, léala secuencia por cuadra y actualiza el hash para cada bloque.
- Elimine el doble almacenamiento en búfer, es decir, no use IO con búfer, porque ya usamos un tamaño de bloque óptimo.
Ejemplo:
import hashlib
def sha256sum(filename):
h = hashlib.sha256()
with open(filename, ''rb'', buffering=0) as f:
for b in iter(lambda : f.read(128*1024), b''''):
h.update(b)
return h.hexdigest()
TL; DR utilizan búferes para no usar toneladas de memoria.
Llegamos al meollo de su problema, creo, cuando consideramos las implicaciones de la memoria de trabajar con archivos muy grandes . No queremos que este chico malo agote 2 gigas de ram para un archivo de 2 gigabytes así que, como señala pasztorpisti , ¡tenemos que lidiar con esos archivos más grandes en trozos!
import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], ''rb'') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))
Lo que hemos hecho es actualizar nuestros hashes de este chico malo en trozos de 64kb a medida que avanzamos con el práctico método de actualización de dahlib. ¡De esta manera usamos mucha menos memoria que 2 gb que le tomaría golpear al tipo todo de una vez!
Puedes probar esto con:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
¡Espero que ayude!
Además, todo esto se describe en la pregunta vinculada en el lado derecho: obtener MD5 hash de archivos grandes en Python
¡Apéndice!
En general, al escribir python, ayuda a adquirir el hábito de seguir a pep-8 . Por ejemplo, en python las variables suelen ser underscore separadas no camelCased. Pero eso es solo estilo y a nadie realmente le importan esas cosas, excepto las personas que tienen que leer el estilo malo ... que podría ser que leyera este código dentro de unos años.
import hashlib
user = input("Enter ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
with open("encrypted.txt","w") as e:
print(h2,file=e)
with open("encrypted.txt","r") as e:
p = e.readline().strip()
print(p)