6

我有不到一年的编程经验。在学习读写文件时,我遇到了这个教程:http ://www.penzilla.net/tutorials/python/fileio/

本教程提供以下示例作为创建和写入文件的简单脚本:

# Let's create a file and write it to disk.
filename = "test.dat"
# Let's create some data:
done = 0
namelist = []
while not done:
    name = raw_input("Enter a name:")
    if type(name) == type(""):
        namelist.append(name)
    else:
        break

# Create a file object:
# in "write" mode
FILE = open(filename,"w")

# Write all the lines at once:
FILE.writelines(namelist)

# Alternatively write them one by one:
for name in namelist:
    FILE.write(name)

FILE.close()  

我复制了这段代码并通过 Python 2.7.3 Shell 运行它。我被反复提示输入附加到将写入文件的列表的字符串(这对我来说很有意义)。我不明白的是退出 While 循环的条件(“虽然未完成:”)。我认为这意味着我在提示符下键入 done 以退出循环并随后写入文件,但 done 没有任何效果。然后我认为在提示符下输入的任何非字符串都应该打破循环并写入文件。我根本无法打破循环;对于我在提示符下输入的任何内容,我只是再次提示“输入名称:”。

通过删除 While 循环并保留 if/else 语句,我使代码适用于单个提示。有人可以告诉我我在这里不明白的地方吗?我猜这是一个相当简单的概念,在教程中没有解释,因为它被认为是显而易见的。由于“完成”是一个如此常见的词,我无法找到任何 Python 特定的含义。

4

4 回答 4

4

我现在会停止学习该教程。代码不是 Pythonic,太复杂了,而且似乎已经过时了。

话虽如此,这就是我编写该教程代码的方式(是的,它做同样的事情,但只有正确的方式):

with open('test.dat', 'w') as handle:
  while True:
    name = raw_input('Enter a name: ')

    if not name:
      break

    handle.write(name + '\n')
于 2012-08-05T23:23:36.417 回答
2

这不是你的错。该代码无法跳出循环。

if name == 'end':
  break
于 2012-08-05T23:19:31.473 回答
2

done在第 3 行分配一次:

done = 0

因此,只要 done 仍然是“非 0”,while 循环就会继续循环:

while not done:

即它将继续永远循环,除非它遇到一个break语句(第 11 行)。不幸的是,代码有缺陷,这永远不会发生。

如果您想在键入“完成”时停止,则将 if 语句更改为:

if name == "done":

但是,请注意,done上面的文字字符串与之前分配的变量无关。done

于 2012-08-05T23:21:55.127 回答
1

首先,代码很糟糕。

在这种情况下,done是变量的名称。正如所写,它将永远循环,因为没有办法退出。

您应该停止遵循该教程并选择一个更好的教程:http ://wiki.python.org/moin/BeginnersGuide/NonProgrammers

于 2012-08-05T23:21:10.137 回答