Разница в обработке файлов между Python 2.7 и 3.5

#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 .