<p>代码的主要问题是打开文件并多次读取。第一次文件对象位置移到末尾并停留在那里。下次读取该文件时不会发生任何事情,因为您已经在文件的末尾。在</p>
<h2>示例</h2>
<p>有时候一个例子比很多词更有价值。
以文件<code>test_file.txt</code>为例,行如下:</p>
<pre><code>line1
line2
</code></pre>
<p>现在打开文件并读两遍:</p>
^{pr2}$
<p>第二次什么都没有发生,因为文件对象已经在末尾。在</p>
<h2>解决方案</h2>
<p>这里有两个选项:</p>
<ol>
<li><p>只读取一次该文件并将所有行保存在一个列表中,然后在代码中使用该列表。它应该足够替换了</p>
<pre><code>wordListFile = open("customPassFile.txt", encoding="utf8")
num_lines = sum(1 for line in open('customPassFile.txt'))
</code></pre>
<p>与</p>
<pre><code>with open("customPassFile.txt", encoding="utf8") as f:
wordListFile = f.readlines()
num_lines = len(wordListFile)
</code></pre></li>
<li><p>在使用<a href="https://docs.python.org/3/library/io.html#io.IOBase.seek" rel="nofollow noreferrer">^{<cd2>}</a>读取文件后重置文件对象位置。这将是一条线索:</p>
<pre><code>for i, line in enumerate(wordListFile):
if(i == currentLine):
line = line
wordListFile.seek(0)
</code></pre></li>
</ol>
<p>我会选择选项1,除非你有内存限制(例如文件大于内存)</p>
<h2>注释</h2>
<p>我有一些额外的注释:</p>
<ul>
<li><p>python以0(如c/c++)而不是1(如fortran)启动计数器。因此,您可能需要设置:</p>
<pre><code>currentLine = 0
</code></pre></li>
<li><p>当您读取一个文件时,新行字符<code>\n</code>不会被删除,因此您必须(使用<a href="https://docs.python.org/3/library/stdtypes.html#str.strip" rel="nofollow noreferrer">^{<cd4>}</a>)执行此操作或在比较字符串时对其进行解释(例如使用<a href="https://docs.python.org/3/library/stdtypes.html#str.startswith" rel="nofollow noreferrer">^{<cd5>}</a>)。例如:</p>
<pre><code>passwordChecking == passwordCracking
</code></pre></li>
</ul>
<p>很可能总是返回<code>False</code>,因为<code>passwordChecking</code>包含{<cd3>},而{<cd9>}很可能没有</p>
<h2>Discramer公司</h2>
<p>我没有尝试过代码,也没有尝试过我的建议,所以可能有其他bug潜伏在周围。在</p>