0

我正在使用 Python 2.7.3 顺便说一句

大家好,

我有一个小问题。问题是我一直遇到下面的星号线问题。(对不起,对 Python 有点陌生)

所以这是我到目前为止的代码:

with open('parsedChr','w') as fout, open('heartLungClassU.gtf','r') as filein:

    average = 0
    difference = 0
    position = ''
    bp = 0

    for line in filein:
      **chrom,cuff,exon,start,end,dot,sign,dots,gene,tranid,exonid,rest = line.split('\t',11)**
      ## notice 12 variables here so I tried to unpack with value 11

    ##more code after

我不断收到此错误:

Traceback (most recent call last):
  File "parse.py", line 11, in <module>
    chrom,cuff,exon,start,end,dot,sign,dots,gene,tranid,exonid,rest = line.split('\t',11)
ValueError: need more than 9 values to unpack

我不明白为什么——请注意,我将行分成 12 个变量。为什么 python 会抱怨需要 9 个以上的值来解包?我之前有过代码,我必须拆分为 6 个变量,因此在 line.split 中使用了 5 个(据我理解,5 个被分成 6 个部分),但我不明白为什么类似的逻辑在这里不起作用。

编辑:这是文件的一部分:

chr1    Cufflinks   exon    14765607    14765689    .   +   .   gene_id "XLOC_000018";  transcript_id   "TCONS_00001260";   exon_number "1";    oId "CUFF.68.1";    class_code  "u";    tss_id  "TSS40";
chr1    Cufflinks   exon    14766604    14767199    .   +   .   gene_id "XLOC_000018";  transcript_id   "TCONS_00001260";   exon_number "2";    oId "CUFF.68.1";    class_code  "u";    tss_id  "TSS40";
chr1    Cufflinks   exon    21156530    21156632    .   +   .   gene_id "XLOC_000028";  transcript_id   "TCONS_00002433";   exon_number "1";    oId "CUFF.88.1";    class_code  "u";    tss_id  "TSS69";

编辑:嗯。弄清楚了。感谢大家的帮助。

4

3 回答 3

4

要查看错误所在的确切行号,请执行以下操作:

for i, line in enumerate(filein):
    try:
        chrom,cuff,exon,start,end,dot,sign,dots,gene,tranid,exonid,rest = line.split('\t',11)
    except ValueError:
        print "ValueError on line", i+1
        print "line", repr(line)
        raise

在您的评论中,您提供了指向您的文本文件的链接。我没有找到少于 11 个选项卡的任何行:

>>> for i, line in enumerate(urllib.urlopen('http://dl.dropbox.com/u/108419362/file.gtf')):
...     if line.count('\t') < 11:
...         print i+1, repr(line)
...         break
...
>>>

仔细检查您是否真的打开了您认为正在打开的文件。

于 2012-10-17T20:02:29.710 回答
2

这意味着您的行不包含足够的(在这种情况下至少 9 个)制表符字符,因此split()call 将使用拆分值填充所有变量。

以下代码将产生相同的错误:

s = 'a b'
x, y, z = s.split(' ') # the result is ('a', 'b') but we have 3 variables
                       # on the left side of the expression.
于 2012-10-17T19:59:39.123 回答
2

这意味着该行仅拆分为 9 个值:

例子:

>>> a,b,c='foo bar'.split()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack

您可以添加一个if条件来处理此问题:

if len(line.split('\t'))>=11:
于 2012-10-17T20:00:15.757 回答