2

特定の形式のファイルを読み取るクラスがあります。これらのファイルは、サイズが 8Gb を超える傾向があるため、通常は圧縮されています。ファイルを読み取るときに、ファイルが圧縮されていないというエラーをキャッチしたかったのですが、何らかの理由で圧縮されていませんexcept IOError:except:

問題のあるクラスはvcfReader(). オブジェクトのインスタンス化元のファイルはtest.pyの下にあり、最後に Traceback があります。

なぜそれが機能しないのか、誰にもアイデアがありますか?

VCF.py

import gzip
import sys

class Call():
    '''
    Class to handle the sample genotypes and associated information
    '''

    def __init__(self,site,sample,format,data):
        #do stuff here#

class Variant():
    '''
    Class for a single row from a VCF file.
    '''
    def __init__(self, entry, samples):
       #do other stuff here


class vcfReader():
    '''
    read a compressed vcf file ignoring the meta-information, but parsing the header             for sample names
    '''  
    def __init__(self, file):
        try:
            self.vcfFile = gzip.open(file, 'rb')
        except IOError:
            print "Not a gzipped file"
            sys.exit()

        self.samples = self.readHeader()

    def readHeader(self):
        line = self.vcfFile.next()
        while line.startswith('#'):
            if line[1]!='#':
                #lines that start with ##, i.e. meta tags are ignored. Header line starting with '#', sample names are extracted.
                return line.rstrip().rsplit('\t')[9:]
            else:           
                line = self.vcfFile.next()

    def __iter__(self):
        return self

    def next(self):
        row =  self.vcfFile.next()
        return Variant(row, self.samples)

そしてtest.py

import VCF
from collections import Counter

if __name__=='__main__':
    vcfreader = VCF.vcfReader('all_samples.vcf')

    filters = []
    for i in vcfreader:
        filters.extend(i.FILTERS)

    filters = Counter(filters)

    for k,v in filters.iteritems():
        print "{0}: {1}".format(k,v)

トレースバックは次のとおりです。

Traceback (most recent call last):
  File "C:\Users\Davy\Documents\Programming\VCF_stuff\src\test.py", line 10, in <module>
    vcfreader = VCF.vcfReader('all_samples.vcf')
  File "C:\Users\Davy\Documents\Programming\VCF_stuff\src\VCF.py", line 95, in __init__
    self.samples = self.readHeader()
  File "C:\Users\Davy\Documents\Programming\VCF_stuff\src\VCF.py", line 98, in readHeader
    line = self.vcfFile.next()
  File "C:\Python27\lib\gzip.py", line 450, in readline
    c = self.read(readsize)
  File "C:\Python27\lib\gzip.py", line 256, in read
    self._read(readsize)
  File "C:\Python27\lib\gzip.py", line 291, in _read
    self._read_gzip_header()
  File "C:\Python27\lib\gzip.py", line 185, in _read_gzip_header
    raise IOError, 'Not a gzipped file'
IOError: Not a gzipped file
4

1 に答える 1

4

exceptブロックが例外をキャッチしない理由は、ブロックの外側で発生するためtryです。

def __init__(self, file):
    try:
        self.vcfFile = gzip.open(file, 'rb')
    except IOError:
        print "Not a gzipped file"
        sys.exit()

    self.samples = self.readHeader() # <<<<<<<< exception is raised here
于 2013-01-19T18:38:21.530 に答える