福尔摩斯 argparse 模块任务
Posted
技术标签:
【中文标题】福尔摩斯 argparse 模块任务【英文标题】:Sherlock Holmes argparse module task 【发布时间】:2021-06-02 18:41:16 【问题描述】:我接到的任务似乎超出了我目前使用 python 的能力。尽管如此,我确实想解决它,但不知道从哪里开始。尤其是这里的这一点:“编写一个程序,将文件作为参数,读取它,解码它,然后打印解码的文本”。非常感谢任何帮助!
任务描述:
莫里亚蒂教授又惹事了!玛丽设法获得了一份包含他计划的一部分的文件,但它已被编码。在她破译之前,Moriarty 劫持了她的人质,Watson 博士前去营救。
Holmes 预料到了这一点,并在 *** 上找到了一个简单的 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:设置命令行以快速循环通过许多键/'n' 参数。找到解码后的消息后,将其粘贴到不带引号的答案字段中。
提示 3:你不需要使用 argsparser,主要问题是找到“n”。
数据集可以从this link下载
【问题讨论】:
请将其缩减为minimal reproducible example。另见homework guidance. 【参考方案1】:您需要的是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", required=True, 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 = -", n, sep="", end=", ")
decode_Caesar_cipher(encoded_text, -n)
if __name__=="__main__":
main()
【讨论】:
您好 Aarni,感谢您的反馈。只是为了让我更好地理解这一点,我应该在什么时候运行解码器? 我已经编辑了我的答案,以包含更多的程序结构来帮助您进步。看main
函数,里面有例子程序执行其他函数的顺序。
Aarni,我非常感谢您添加的编辑。高度赞赏!我知道这听起来可能很奇怪,但我以前从未使用过 IDE,所以我有点迷茫。我可以在某种程度上理解您发布的程序结构,但是如何在 IDE 上运行是一个障碍。这个挑战很艰巨,因为它是今天发布的,截止日期也是今天(还有几个小时)。我在想:我可以简单地将编码文本(由于字符数限制将在下一个评论中发布)粘贴到程序中并跳过打开和读取文件的过程吗?
下载的带有编码文本的文件:Qrn!Mfur!y,pxIMvsMF,BH!rM!rnqv'tMAuv IMAur'JJJMVHzMCr!FIMCr!FMqv n..,v'ArqJMQvqMF,BM!rnyyFMAuv'xMVMD,ByqMB rMAurMPrn r!Mpv.ur!MA,Mr'p,qrMzFMrCvyM.yn'KMc,,!MAuv'tLMjur'MqvqMF,BM A,.MB v'tMF,B!Mo!nv'KMOr AMDv ur IMZ,!vn!AF
确定 n 发生在解码器函数内部,对吧?
你基本上是从这样的控制台运行你的程序:python your_program_name.py --file name_of_deciphered_file.txt
。在您的 IDE 中,找到控制台并键入此命令。您还可以使用命令提示符,例如Windows 中的“命令提示符”。确定n
发生在解码器函数之外,因为如您所见,解码器函数恰好采用一个 n 作为参数。据我了解,您不应该将文本粘贴到程序中,因为它被明确指示从命令行参数加载。以上是关于福尔摩斯 argparse 模块任务的主要内容,如果未能解决你的问题,请参考以下文章
如何测试我的代码是不是引发了适当的 argparse 异常?