<p>你这里有几个问题。首先,对于那些花了大量时间编写特定Python风格标准的人来说,代码的格式设置使他们很难阅读。我建议你从<a href="https://www.python.org/dev/peps/pep-0008/" rel="nofollow">PEP8</a>开始,然后从那里发展你的风格。在</p>
<p>我认为这个代码重新格式化保留了代码的含义。如果我错了,请纠正我。在</p>
<pre><code>self.info = lsp[7]
isplit = self.info.split(';')
infonum = 0
for infofield in isplit:
if infofield.split('=')[0] == 'AA':
self.ancestinfo = True
self.ancest = infofield.split('=')[1]
if self.ancest == '.':
self.failed = 1
return
infonum += 1
self.format = lsp[8]
self.gtypes = lsp[9:]
fsp = self.format.split(':')
self.fdpos = -1
self.depthpos = -1
formatnum = 0
for field in fsp:
if field == 'DP':
self.depthpos = formatnum
formatnum += 1
#if len(self.gtypes) != nsamp:
# raise(" incorrect number of individuals in line " + line)
i = 0
for fd in fsp:
if fd == "FD":
self.fdpos = i
i = i + 1
if self.fdpos != -1:
for gtypestr in self.gtypes:
gtype = gtypestr.split(':')
if gtype[self.fdpos] == '0':
self.nalt += int(gtype[0][0] == '1') + int(gtype[0][2] == '1')
self.nref += int(gtype[0][0] == '0') + int(gtype[0][2] == '0')
#print self.nref,self.nalt
else:
for gtypestr in self.gtypes:
gtype = gtypestr.split(':')
#print gtype
if gtype[0] != '.' and gtype[0] != './.':
if int(gtype[self.depthpos]) >= cutoff:
self.nalt += int(gtype[0][0] == '1') + int(gtype[0][2] == '1')
self.nref += int(gtype[0][0] == '0') + int(gtype[0][2] == '0')
#print self.nref,self.nalt
</code></pre>
<p><strong>第一个问题</strong></p>
<p>最初的问题是<code>ValueError: invalid literal for int() with base 10: '0|0'</code>-这是因为调用<br/>时有以下值
<code>gtype = gtypestr.split(':')</code>使用示例输入:</p>
^{pr2}$
<p><code>str.split(delimiter)</code>的输出总是一个列表,因此<code>gtype</code>的值是<code>['0|0']</code>。在</p>
<p><code>gtype[self.depthpos]</code>等于<code>gtype[-1]</code>,这等于<code>gtype[0]</code>,因为<code>gtype</code>是长度为1的列表。在</p>
<p>因此,您调用<code>int('0|0')</code>,这会给您错误。在</p>
<p><strong>第二个问题</strong></p>
<p>将<code>gtypestr.split(':')</code>更改为<code>gtypestr.split('|')</code>的建议假定错误来自于对错误字符的拆分。这变化给了你</p>
<pre><code>gtype = ['0', '0']
int(gtype[self.depthpos]) == int(gtype[-1]) == int('0') == 0
</code></pre>
<p><code>cutoff</code>没有在您给我们的代码示例中定义,但是我假设<code>0 >= cutoff</code>然后我们运行这个块:</p>
<pre><code>self.nalt += int(gtype[0][0] == '1') + int(gtype[0][2] == '1')
self.nref += int(gtype[0][0] == '0') + int(gtype[0][2] == '0')
</code></pre>
<p>这就是当你调用<code>gtype[0][2]</code>时给你的<code>IndexError: string index out of range</code>-这相当于调用<code>'0'[2]</code>,并且在一个字符串中没有第三个字符。在</p>
<p>这个块看起来像是在尝试处理<code>.split(':')</code>调用返回的第一个子字符串中间的分隔符。在</p>
<p>所以我不知道如何前进:</p>
<ul>
<li>修复那些<code>gtype[0]</code>子字符串调用以针对不同的字符串工作?在</li>
<li>保留<code>.split(':')</code>并更改截止测试?在</li>
<li>这两种情况都是需要简化的复杂输入文件格式的症状?在</li>
</ul>
<p>你能告诉我们更多关于输入格式的信息吗?在</p>