Я испытываю неожиданное поведение при чтении файла и хэшировании (в Python 3.7).
У меня есть файл, в котором просто есть текст "helloworld", без перевода строки в конце:
>>hexdump -C input.txt
00000000 68 65 6c 6c 6f 77 6f 72 6c 64 0a |helloworld.|
0000000b
Я запускаю следующий скрипт Python:
def hashit(inp):
return hashlib.md5(inp.encode('utf-8')).hexdigest()
from_var = 'helloworld'
with open('input.txt', 'r') as fo:
from_file = fo.read()
print(f' from_file : { repr(from_file) }')
print(f' from_var : { repr(from_var) }')
print(f' from_file hash : { hashit(from_file) }')
print(f' from_var hash : { hashit(from_var) }')
Я получаю следующий вывод:
from_file : 'helloworld\n'
from_var : 'helloworld'
from_file hash : d73b04b0e696b0945283defa3eee4538
from_var hash : fc5e038d38a57032085441e7fe7010b0
Первое, что я замечаю, это перевод строки в конце, когдаЯ прочитал файл.Откуда это взялось?
Учитывая завершающий символ новой строки, неудивительно, что хеш-коды для этих двух строк различны.
Чтобы проверить, я запустил утилиту md5sum непосредственно для файла:
>>md5sum input.txt
d73b04b0e696b0945283defa3eee4538 input.txt
Этого я совсем не понимаю.Сумма md5 из оболочки совпадает с суммой md5 строки с завершающей новой строкой - даже если в файле нет новой строки.
Итак, мои вопросы:
- Почемули .read () добавлять новую строку в конец файла?
- Почему md5sum из командной строки соответствует строке ** с ** завершающей новой строкой, даже если в файле нет новой строки?