4

我正在尝试编写一个程序来打开一个文本文件,并将文件中的每个字符向右移动 5 个字符。它应该只对字母数字字符执行此操作,并保留非字母数字字符。(例如:C 变为 H)我应该使用 ASCII 表来执行此操作,但当字符环绕时我遇到了问题。例如:w 应该变成 b,但我的程序给了我一个 ASCII 表中的字符。我遇到的另一个问题是所有字符都打印在不同的行上,我希望它们都打印在同一行上。我不能使用列表或字典。

这就是我所拥有的,我不确定如何做最后的 if 语句

def main():
    fileName= input('Please enter the file name: ')
    encryptFile(fileName)


def encryptFile(fileName):
    f= open(fileName, 'r')
    line=1
    while line:
       line=f.readline()
       for char in line:
           if char.isalnum():
               a=ord(char)
               b= a + 5
               #if number wraps around, how to correct it
               if 

                print(chr(c))
            else:
                print(chr(b))
        else:
            print(char)
4

3 回答 3

7

使用str.translate

In [24]: import string

In [25]: string.uppercase
Out[25]: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

In [26]: string.uppercase[5:]+string.uppercase[:5]
Out[26]: 'FGHIJKLMNOPQRSTUVWXYZABCDE'

In [27]: table = string.maketrans(string.uppercase, string.uppercase[5:]+string.uppercase[:5])

In [28]: 'CAR'.translate(table)
Out[28]: 'HFW'

In [29]: 'HELLO'.translate(table)
Out[29]: 'MJQQT'
于 2013-03-07T00:51:17.653 回答
1

首先,它是小写还是大写很重要。我将在这里假设所有字符都是小写的(如果不是,那么制作它们就很容易了)

if b>122:
    b=122-b  #z=122
    c=b+96   #a=97

w=119 in ASCII and z=122 (decimal in ASCII) 所以 119+5=124 和 124-122=2 这是我们的新 b,然后我们将它添加到 a-1(如果我们得到 1回来,2+96=98 和 98 是 b。

对于在同一行上打印,而不是在您拥有它们时打印,我会将它们写入一个列表,然后从该列表创建一个字符串。

例如,而不是

    print(chr(c))
else:
    print(chr(b))

我会做

     someList.append(chr(c))
else: 
     somList.append(chr(b))

然后将列表中的每个元素连接到一个字符串中。

于 2013-03-07T00:46:29.250 回答
0

您可以创建一个字典来处理它:

import string
s = string.lowercase + string.uppercase + string.digits + string.lowercase[:5]
encryptionKey = {s[i]:s[i+5] for i in range(len(s)-5)}

s( )的最后一个加数+ string.lowercase[:5]将前 5 个字母添加到密钥中。然后,我们使用简单的字典推导来创建加密密钥。

放入您的代码中(我也对其进行了更改,以便您遍历这些行而不是使用f.readline()

import string
def main():
    fileName= input('Please enter the file name: ')
    encryptFile(fileName)


def encryptFile(fileName):
    s = string.lowercase + string.uppercase + string.digits + string.lowercase[:5]
    encryptionKey = {s[i]:s[i+5] for i in range(len(s)-5)}
    f= open(fileName, 'r')
    line=1
    for line in f:
       for char in line:
           if char.isalnum():
               print(encryptionKey[char])
           else:
                print(char)
于 2013-03-07T00:50:54.567 回答