Python密码学编程:文件的加密与解密( 二 )


要解密密文,可以对源代码进行下述改变(粗体部分),随后再次运行这个程序 。
7.inputFilename = 'frankenstein.encrypted.txt' 8.# 如果具有outputFilename 名称的文件已存在,则此程序 9.# 覆盖该文件10.outputFilename = 'frankenstein.decrypted.txt'11.myKey = 1012.myMode = 'decrypt' # 设置为 'encrypt'或'decrypt'这时候运行该程序,就会在当前文件夹下创建出一个名为 frankenstein.decrypted.txt 的新文件,此时这个新文件的内容和原始明文是一致的 。
10.4 文件操作在深入研究 transpositionFileCipher.py 文件的源代码之前,首先要明白Python是如何对文件进行操作的 。读取文件内容的3个步骤分别是打开文件、读取文件内容并将其存储到一个变量中、关闭文件 。类似地,要将新内容写入文件中时,首先必须打开(或创建)一个文件,接着将新的内容写入其中,最后关闭这个文件 。
10.4.1 打开文件Python可以通过open()方法打开一个文件以供读取、写入内容时使用,其第一个参数为文件名 。当要打开的文件和Python程序处于同一个文件夹下时,可以直接使用文件名,例如“thetimemachine.txt”,如果当前文件夹存在这么一个文件,则打开它的Python指令如下所示 。
fileObj = open('thetimemachine.txt')这样,一个文件对象就被存储在变量 fileObj 中了,之后进行读写操作时使用这个变量即可 。
还可以用文件的绝对路径(absolute path)作为第一个参数,这样引号内就需要包括文件所在的文件夹及其所有父文件夹的名称,举个例子,类似“C:\Users\Al\frankenstein.txt”(Windows系统下),或“/Users/Al/frankenstein.txt”(macOS及Linux系统下)格式的都是绝对路径 。记住,Windows系统下,反斜线(/)前一定要多加一个反斜线用于转义 。
举个例子,若想打开“frankenstein.txt”文件,则需要将其路径以字符串的形式作为open()方法的第一个参数(绝对路径的格式由使用的操作系统决定) 。
fileObj = open('C:\Users\Al\frankenstein.txt')文件对象有多种用于读取、写入和关闭文件的方法,下面将对这些方法进行详细介绍,为方便说明这里调换一下顺序 。
10.4.2 数据写入及文件关闭对于文件的加密程序而言,在读取文本内容之后就需要将加密的数据写入一个新的文件中,这时用到的方法就是write() 。
要想使用一个文件对象的write()方法,首先需要将文件以写模式打开,即将字符串 'w' 传入open()方法作为其二个参数 。open()方法的第二个参数是一个可选参数(optional parameter),这意味着open()方法在没有第二个参数的情况下仍然能够被调用 。例如,将下列代码输入交互式运行环境中 。
>>> fileObj = open('spam.txt', 'w')这一行以写模式创建了一个名为“spam.txt”的文件,则可以对其进行编辑 。如果在open()方法创建新文件的路径下存在一个同名文件,则该同名文件将被重写,因此,以写模式使用opne()方法时需要万分小心 。
spam.txt 以写模式打开后,就可以调用write()方法往其中写入内容了 。write()方法有一个参数:存储在一个字符串中的、将要被写入文件的内容 。将下列代码输入交互式运行环境,把字符串Hello, world!写入 spam.txt 中 。
>>> fileObj.write('Hello, world!')13上述代码将字符串Hello, world!作为参数传入write()方法,把该字符串写入文件 spam.txt 中并打印出数字13,这个数字代表了写入文件中的字符数 。
对文件的操作执行完成之后,需要通过调用文件对象的close()方法告知Python此事 。
>>> fileObj.close()除上述必定会覆盖原文件内容的写模式之外,还存在一个附加模式,在该模式下字符串会被添加到文件已有内容的末尾 。尽管本章程序中没有用到这个模式,读者也可以自己尝试以附加模式打开文件,只需要将字符串 'a' 作为 open() 方法的第二个参数即可 。
如果在调用文件对象的write()方法时,遇到了“io.UnsupportedOperation: not readable”的报错信息,则可能是因为没有以写模式打开文件 。调用open()方法的过程中若没有包括可选参数,则其默认值将被自动设置为写模式('r'),该模式下只允许使用者调用文件对象的read()方法 。
10.4.3 读取文件read()方法能够以字符串的形式返回文件中包含的所有内容,为验证其功能,本节将读取之前用wirte()方法创建的 spam.txt 文件 。在交互式运行环境中运行如下代码 。


推荐阅读