簡體   English   中英

我如何在python中的文件上使用rot 13

[英]how do i use rot 13 on a file in python

我試圖用腐爛13重寫文件中的每個字符,並且卡住了,我不確定如何瀏覽文件並查看每個字符,而不用擔心段落之間的空格

# [import statements]
import q2fun
# [constants]

# [rest of program code]
f = open("rot-13.txt", "w", encoding="utf-8")
result = q2fun.rot13(f)

def rot13(f):

    f.seek(0)
#   y = 0
    result = ""
    for char in f:
        x = ord(char)
        if 97 <= x < 110 or 65 <= x < 78:
#           string[y]=char.replace(char, chr(x+13))
            char = char.replace(char, chr(x + 13))
            result = result + char
            print(char)
            continue
#           y+=1
        elif x >= 110 or 78 <= x < 91:
#           string[y]=char.replace(char, chr(x-13))
            char = char.replace(char, chr(x - 13))
            print(char)
            result = result + char
            continue
#           y+=1
        result = result + char
    return result
import codecs


with open("plaintext.txt") as f_in, open("rot-13.txt", "w") as f_out:
    f_out.write(codecs.encode(f_in.read(),"rot_13"))

with open("rot-13.txt") as encoded:
    print (codecs.decode(encoded.read(),"rot_13"))

有關這些功能的說明,請參見codecs模塊上的文檔或交互式解釋codecs的內置help 請參閱“ 標准編碼” (及以下各節)上的文檔,或導入“ encodings模塊並使用內置的help ,以查看可用於這些功能的編碼列表。

如果您只想盡可能輕松地執行此操作,請使用rot_13編解碼器,如Joran Beasley的回答所述。

如果您想知道如何手動進行操作,或者您現有的代碼出了什么問題,我可以解釋一下。 你真的很親密

如果f是文件,則for char in f:遍歷文件的各 ,而不遍歷所有字符 如果要一遍遍地遍歷這些字符,請在f.read(1)周圍循環,或者將整個內容讀入s = f.read()的字符串中,然后遍歷s

如果您解決了該問題,則程序現在可以按編寫的方式工作。 但是,它比必需的更為復雜。

首先, char = char.replace(char, chr(x + 13)) str.replace搜索字符串,將替換字符替換為搜索字符的所有實例,然后返回結果字符串。 但是您不需要任何這些-您要搜索所有一個字符,將搜索字符的一個實例替換為結果字符,然后將結果字符作為一個單字符字符串返回-換句話說,相同的字符串你已經有。 您只想在這里做char = chr(x + 13)

另外,您可以刪除三個單獨的result = result + charcontinue ; 所有這三個條件導致同一件事。

另外,您可以將char與字符值進行比較,而不是將x與順序值(難以閱讀且容易出錯)進行比較。 所以:

def rot13(f):
    s = f.read()
    result = ""
    for char in s:
        x = ord(char)
        if 'a' <= char <= 'm' or 'A' <= char <= 'M':
            char = chr(x + 13)
        elif 'n' <= char <= 'z' or 'N' <= char <= 'Z':
            char = chr(x - 13)
        result = result + char
    return result

您可以使用str.lower進一步簡化比較:

        if 'a' <= char.lower() <= 'm':

(這取代了if 'a'…線在上面的代碼,你做了同樣的事情elif 'n'…行。)

您可以使用string類中的集合來進一步簡化事情:

        if char in string.ascii_letters:
            if char.lower() <= 'm':
                char = chr(x + 13)
            else:
                char = chr(x - 13)

(這將替換整個if / elif塊。)

或者,如果您知道% (mod / remainder)運算符的作用,則可以進一步簡化它: rot13(ch)只是(ch+13) % 26 (其中ch是從025的字母數字,您可以可以使用ord(char) % 32 )獲得。 常規的C實現利用了這一點,您可以使用python中的divmod函數將其更清楚地編寫。 但我會將其留給讀者練習。

python3的老式實現


def ROT_13(realText):
    outText = ""
    cryptText = []
    step = 13
    uppercase = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    lowercase = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    puncuation = [",","'",":","!","~","`","@","#","$","%","^","&","*","(",")","-","_","+","=","<",">","/","?",";","\\","|","{","}","[","]"]

    for eachLetter in realText:
        if eachLetter in uppercase:
            index = uppercase.index(eachLetter)
            crypting = (index + step) % 26
            #print("{}  index={} Crypt={}".format(eachLetter,index,crypting))
            cryptText.append(crypting)
            newLetter = uppercase[crypting]
            outText += (newLetter)
        elif eachLetter in lowercase:
            index = lowercase.index(eachLetter)
            crypting = (index + step) % 26
            #print("{}  index={} Crypt={}".format(eachLetter,index,crypting))
            cryptText.append(crypting)
            newLetter = lowercase[crypting]
            outText += (newLetter)
        elif eachLetter in puncuation:
          outText += eachLetter 
        else:
          outText += " "
    return outText

你可以這樣稱呼它

code = ROT_13("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
print(code)

得到結果

NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

它甚至可以處理空格,特殊字符,如#和CAPS

code2 = ROT_13("it even handles spaces, special characters as , # and CAPS")

要得到

"vg rira unaqyrf fcnprf, fcrpvny punenpgref nf , # naq PNCF"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM