如何解决福尔摩斯 argparse 模块任务
我接到的任务似乎超出了我目前使用 Python 的能力。尽管如此,我确实想解决它,但不知道从哪里开始。特别是这里的这一点:“编写一个程序,将文件作为参数,读取它,解码它,并打印解码的文本”。非常感谢任何帮助!
任务描述:
莫里亚蒂教授又来捣乱了!玛丽设法获得了一个包含他的计划的文件,但它已被编码。在她解码之前,Moriarty 已将她劫为人质,Watson 博士前去营救。
Holmes 预料到了这一点,并在 Stackoverflow 上找到了一个简单的 Caesar 密码解码器来自己处理:
def decode_Caesar_cipher(s,n):
alpha = " ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',.?!"
s = s.strip()
text = ''
for c in s:
text += alpha[(alpha.index(c) + n) % len(alpha)]
print('Decoded text: "' + text + '"')
然而,福尔摩斯不知道如何处理文件,所以你必须帮助他!您可以在下方找到 Mary 从 Moriarty 的笔记本电脑中获取的文件。下载它,并使用 Holmes 找到的代码,编写一个程序,将文件作为参数,读取它,解码它,并打印解码的文本。为此,请使用您的 IDE。得到答案后,将其复制并粘贴到答案字段中。
如果您的参数 --file
存储在变量 args
中,您可以通过以下方式读取您传递给脚本的文件:
filename = args.file
opened_file = open(filename)
encoded_text = opened_file.read() # read the file into a string
opened_file.close() # always close the files you've opened
提示 1:最初 Holmes 从 Mary 那里得到的文件名为“13.txt”,因此他预设这可能是偏移量 n
。检查这个理论,但请记住,解码偏移量必须带负号。
提示 2:设置命令行以快速循环浏览许多 key/'n' 参数。找到解码后的消息后,将其粘贴到不带引号的答案字段中。
提示 3:你不需要使用 argsparser,主要问题是找到“n”。
数据集可以从this link
下载解决方法
您需要的是 argparse
Python 标准库。它可以在您的情况下使用如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--file",required=True,help="Path to file")
args = parser.parse_args()
然后在您的例如main
函数,您可以按如下方式访问参数:
file = args.file
你会这样调用程序:
python your_program.py --file filename/or/path/to/file
在 Python 中,我建议在文件所在的同一目录(文件夹)中运行程序。 现在您在一个变量中拥有文件的名称,并且可以按照您喜欢的方式加载它。
编辑: 所以最后,你的程序结构可能是这样的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--file",help="Path to file")
args = parser.parse_args()
def read_file(filename):
opened_file = open(filename)
encoded_text = opened_file.read() # read the file into a string
opened_file.close() # always close the files you've opened
return encoded_text
def decode_Caesar_cipher(s,n):
alpha = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',.?!"
s = s.strip()
text = ''
for c in s:
text += alpha[(alpha.index(c) + n) % len(alpha)]
print('Decoded text: "' + text + '"')
def main():
filename = args.file
encoded_text = read_file(filename)
# Note that before calling decode_Caesar_cipher,you need to determine 'n',# which seems to be the main task for this programming challenge.
# This can be achieved with e.g. a for loop
for n in range(1,30):
print("n =",n,end=",")
decode_Caesar_cipher(encoded_text,n)
print("n = -",sep="",-n)
if __name__=="__main__":
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。