[英]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 + char
并continue
; 所有这三个条件导致同一件事。
另外,您可以将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
是从0
到25
的字母数字,您可以可以使用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.