0

私はPython 2.7.3 btwを使用しています

こんにちは、みんな、

少し問題があります。問題は、下のスター付きの行で問題が発生し続けることです。(申し訳ありませんが、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 個あることに注意してください。アンパックするのに9つ以上の値が必要だとPythonが文句を言うのはなぜですか? 以前にコードを 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()呼び出しによってすべての変数が分割された値で埋められることを意味します。

次のコードは同じエラーを生成します。

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 に答える