<p>如果在程序中选择(e)ncrypt中的选项,则输入退出条件始终为true的<code>while</code>循环。在这个循环中,即使输入有效的文件名,循环也会继续。一旦输入了一个有效的文件名,就可以使用<code>break</code>语句来解决这个问题</p>
<pre><code>if userInput == 'e':
while True:
path = input("Enter the text-file name to encrypt: ")
if osp.exists(path):
encrypt(path)
print("Yeah!,1")
break
else:
print("Sorry the file", path, "does NOT exist please try again!")
</code></pre>
<p>在(d)ecrypt部分,如果用户输入预先存在的文件名,则提供覆盖选项。但是,如果用户再次输入预先存在的文件的名称,您可能会再次显示警告用户的消息。您可以将它放在一个循环中执行<code>break</code>语句,如果用户允许覆盖这个文件,比如</p>
<pre><code>elif userInput == 'd':
path = input("Enter the text-file name to decrypt: ")
if osp.exists(path):
fileName,fileExtension = osp.split(path)
fileName = fileName+".txt"
print("Filename: ", fileName, "path: ", path)
while osp.exists(fileName):
print("WARNING: The file '%s' already exists!" %fileName)
ch = input("Is it okay to wipe it out (y/n)? ")
if ch == 'n':
fileName = input("Enter the file name text that should be used (.txt extension will automatically be added) ")
fileName = fileName + ".txt"
elif ch == 'y':
break
decrypt(path, fileName)
</code></pre>
<p>你可以把整个菜单驱动的部分像</p>
<pre><code>while True:
userInput = input("Would you like to (e)ncrypt a file, (d)ecrypt a file, or e(x)it (enter e, d, or x)? ")
while userInput not in validStrings:
userInput = input("Sorry, that's an invalid choice. Please enter only e, d, or x: ")
if userInput == 'e':
while True:
path = input("Enter the text-file name to encrypt: ")
if osp.exists(path):
encrypt(path)
break
else:
print("Sorry the file", path, "does NOT exist please try again!")
elif userInput == 'd':
path = input("Enter the text-file name to decrypt: ")
if osp.exists(path):
fileName,fileExtension = osp.split(path)
fileName = fileName+".txt"
print("Filename: ", fileName, "path: ", path)
while osp.exists(fileName):
print("WARNING: The file '%s' already exists!" %fileName)
ch = input("Is it okay to wipe it out (y/n)? ")
if ch == 'n':
fileName = input("Enter the file name text that should be used (.txt extension will automatically be added) ")
fileName = fileName + ".txt"
elif ch == 'y':
break
decrypt(path, fileName)
elif userInput == 'x':
print("Program Complete!")
return
</code></pre>
<p>将文件名拆分为其名称和扩展名时,请使用</p>
<pre><code>fileName, fileExtension = osp.splitext(path)
</code></pre>
<p>而不是</p>
<pre><code>fileName,fileExtension = osp.split(path)
</code></pre>
<p>if<code>path</code>只存储文件名。你知道吗</p>
<p>如果<code>path</code>是一条绝对路径或者你可以做些什么</p>
<pre><code>path,fullFileName = osp.split(path)
fileName, fileExtension = osp.splitext(fullFileName)
</code></pre>
<p>阅读<code>splitext()</code><a href="https://docs.python.org/3/library/os.path.html#os.path.splitext" rel="nofollow noreferrer">here</a>。你知道吗</p>