<p>首先,作为elyase<a href="https://stackoverflow.com/a/16768403/1346705">shows</a>,您应该使用<code>with</code>构造,或者应该在末尾关闭文件。而且,正如他所示,在动态读取和处理文本文件时,您永远不要使用<code>.readlines()</code>。只用于循环文件对象的内容。它是逐行迭代的(包括结尾<code>\n</code>)。在</p>
<p>另一个问题是<code>lines = str(lines)</code>。实际上,您的<code>lines</code>最初是一个字符串列表。<code>str</code>将其转换为一个类似<code>"['Meep...', 'wabits...', 'huntin...']"</code>的字符串。首先循环该字符串,得到单个字符(作为单字符字符串)。将其命名为<code>words</code>并不会改变现实。(如果您真的想把单词从行中去掉,您应该使用类似<code>for word in line.split():</code>的东西。)</p>
<p>然后,在单个字符中循环第二次,再次获得单个字符(即循环只循环一次,不添加任何功能)。在</p>
<p>接下来,<code>.replace()</code><em>返回replacement</em>的结果,但它不修改参数。你想把结果赋给某个变量。无论如何,您不能使用<code>string.punctuation</code>作为要替换的旧字符串,因为在源文本中永远找不到它。暴力解决方案必须循环使用标点符号字符串并替换单个字符。在</p>
<p>总而言之,<code>letters</code>仍然包含单个字符,不能替换。然后打印单个字符。<code>print</code>函数添加新行。通过这种方式,您可以看到原始内容呈现为字符串表示的字符串/行列表,这些字符串/行是以中文方式自上而下一列书写的。在</p>
<p>最后,<code>the string.punctuation</code>只是一个字符串常量。在</p>
<pre><code>>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
</code></pre>
<p>您可以通过不导入<code>string</code>模块来简化代码(如果没有这样做的话),并将自己的字符串文本与应该被视为标点字符的字符一起使用。在</p>