-4

我正在尝试从用户那里获取一个值并从 Passwords.txt 文件中读取一个单词列表,然后将每个字母按值向右移动

•def shift():
    value=eval(input("Please enter the value here."))
    file = open("Passwords.txt","w")
    with open ("word-text.txt","r") as m:
        for line in m:
            line=line.strip()
            print (line)
            newString = ""
            for char in line:
                char_int=ord(char)
                t=char_int+value
                if t==124:
                    t = t-27
                charme= chr(t)
                print (char,">>",charme)
                newString += charme
            file.writelines(line+" "+newString+"\n")
4

3 回答 3

1

你不必转换为ascii,你可以使用maketrans函数

def shift_string(text, shift):
    intab='abcdefghijklmnopqrstuvwxyz'
    outab=intab[shift:]+intab[:shift]
    return maketrans(intab, outab)
于 2013-10-27T09:06:48.483 回答
0

繁重的工作是进行单词转换,所以我已经完成了 - 您可以完成其余的工作,因为它非常简单。:)

这通过将每个字符转换为数字表示并纠正循环性能(即Z移动2将输出B)来工作。

def limits_correction(character, distance, start, end):
    char = character
    if char >= start and char < end:
        if char + distance >= end:
            char = char + distance - 26
        else:
            char = char + distance
    return char


def modify_string(string, distance):
    ords = [ord(c) for c in string]

    corrected_distance = 0
    if distance > 26:
        corrected_distance = distance % 26
    elif distance > 0 and distance <= 26:
        corrected_distance = distance

    lower_start = 97
    lower_end = lower_start + 26
    upper_start = 65
    upper_end = upper_start + 26

    shifted_string = []

    for char in ords:
        if char >= lower_start and char < lower_end:
            char = limits_correction(char, corrected_distance, lower_start, lower_end)
        elif char >= upper_start and char < upper_end:
            char = limits_correction(char, corrected_distance, upper_start, upper_end)

        shifted_string.append(chr(char))

    return ''.join(shifted_string)

这也适用于任何整数移位数的大写和小写(从 0 读取到非常大)。

参考:

http://www.asciitable.com/

于 2013-10-27T08:13:09.593 回答
0

你需要自己做作业(或者学习编程没有意义),如果你不明白这个问题,你应该问你的老师澄清。

也就是说,换档原则上非常简单。你可以用手来做。如果你有一个字母,比如 A,将其移动 1(key = 1)会将其转换为 B。在作业中,您移动 2 个位置,因此 A 将变为 C,B(在原始单词中)将变为 D等等。你必须小心字母表的结尾。移位 1 时,Z 变为 A。移位 2 时,Y 变为 A,Z 变为 B。

因此,在您的示例中,HELLO 变为 JGNNQ,因为在移动 2 个位置时:

H => J

E => G

L => N

O => Q

(注意:为了便于阅读,我使用大写字母,但您的作业似乎是关于处理小写字符。我假设您只被要求处理小写字母。)

你怎么做到这一点?查看您获得的链接。基本上 ord() 将一个字符转换为一个整数,而 chr() 将一个这样的整数转换为一个字符。它基于字符在计算机中表示为数字的方式。所以对于一个给定的字符,如果你把它转换成它的ord(),你可以添加键来移动它,然后用chr()把它转换回一个字符。

对于从 Y 和 Z 到 A 和 B 的包装,您可以为此使用模运算符 (%),但要小心,这有点繁琐(您需要计算角色的排序和 'a' 的排序之间的差异,应用 % 26 (它给你一个介于 0 和 25 之间的数字),然后将它添加到 ord('a) 以获得正确的 ord)。如果它太复杂,只需使用几个 IF 即可。

我建议从一个小程序开始,它接受用户的输入并打印输出以检查它是否正常工作。在最终版本中您不需要输入和打印,但它会帮助您测试您的转换代码是否正常工作。

然后你有关于从文件读取和写入文件的部分。您的作业不要求用户输入,而是从文件中读取。您的行with open ("word-text.txt","r") as f:看起来不错,这应该为您提供读取数据所需的文件句柄。您可以使用 f.read() 读取数据并将其分配给变量。我不确定你学到了什么,但我会将字符串拆分成单词,<string>.split()从而创建一个字符串列表(你的单词)。

然后对于每个单词,您使用之前编写的代码来移动字符串,您可以将原始单词和移位的单词都写入输出文件。最简单的可能是从打开输出文件(以写入模式)开始,然后通过在列表上循环来一次性完成移位和写入。

于 2013-10-27T09:24:40.347 回答