#python #python-2.7 #python-3.x #io #compatibility
#python #python-2.7 #python-3.x #io #совместимость
Вопрос:
Итак, я работаю над программой, которая шифрует файлы с помощью транспозиционного шифрования. Я привык к Python 2.7 и попробовал его в файле. Но кажется, что функция 2.7 file.read() делает совсем другие вещи, чем Python 3.5. Для дальнейшего использования, какова точная разница в этих функциях или, может быть, это как-то связано с самим объектом file?
Вероятно, есть какая-то документация по этому вопросу, но я понятия не имею, как эффективно находить там материалы :/
Для любопытных вот код:
import transposition1, os, sys
def fileEncrypt(name, key):
file = open(name, "r ")
encryptedFileName = name "Encrypted.txt"
if os.path.exists(encryptedFileName):
print('This will overwrite the file %s. (C)ontinue or (Q)uit?' % (encryptedFileName))
response = input('> ')
if not response.lower().startswith('c'):
sys.exit()
else:
encryptedFile = open(encryptedFileName, "w ")
else:
encryptedFile = open(encryptedFileName, "w ")
contents = file.read()
cyphertext = transposition1.encode(contents, key)
encryptedFile.write(cyphertext)
encryptedFile.close()
file.close()
def fileDecrypt(name, key):
file = open(name, "r ")
decryptedFileName = name "Decrypted.txt"
if os.path.exists(decryptedFileName):
print('This will overwrite the file %s. (C)ontinue or (Q)uit?' % (decryptedFileName))
response = input('> ')
if not response.lower().startswith('c'):
sys.exit()
else:
decryptedFile = open(decryptedFileName, "w ")
else:
decryptedFile = open(decryptedFileName, "w ")
cyphertext = file.read()
plaintext = transposition1.decode(cyphertext, key)
decryptedFile.write(plaintext)
decryptedFile.close()
file.close()
def main():
decision = input("What do you want to do? (encrypt/decrypt)n")
if decision == "encrypt":
name = input("What is the name of the .txt file?n") ".txt"
if not os.path.exists(name):
print('The file %s does not exist. Quitting...' % (name))
sys.exit()
key = input("What key do you want to use? (integer)n")
try:
key = int(key)
except ValueError:
print("You dumb.")
fileEncrypt(name, key)
print("Encryption finished.")
if decision == "decrypt":
name = input("What is the name of the .txt file?n") ".txt"
if not os.path.exists(name):
print('The file %s does not exist. Quitting...' % (name))
sys.exit()
key = input("What key do you want to use? (integer)n")
try:
key = int(key)
except ValueError:
print("You dumb.")
fileDecrypt(name, key)
print("Decryption finished.")
if __name__ == "__main__":
main()
Комментарии:
1.
r
иw
в python2 напишите двоичный тип (не в юникоде), тогда как в python3 это текстовый тип. Чтобы сделать их одинаковыми, предпочтитеimport io; io.open
. Чтобы обеспечить поведение python2 в обоих местах, используйтеrb
иwb
.2. что, если я намерен сохранить его в виде текста? мне это нужно в удобочитаемой форме, и если файл открыт в wb, он будет записывать данные в двоичном формате, верно?
3. Ваш код, как написано, записывается в двоичном режиме в python2. Если вы хотите всегда писать с помощью текстового типа (
unicode
в PY2 иstr
в PY3), используйтеio.open
сw
иr
.