3
7]                 @   sz   d Z ddgZddlZddlmZ ddlmZmZ ddlm	Z
 dd	lmZ G d
d dZG dd deZG dd deZdS )z+
Classes for reading FASTA and FASTQ files
FastaReaderFastqReader    N)xopen   )
fastq_iterSequence)shorten)FastaFormatErrorc               @   sB   e Zd ZdZdZdZdZedfddZdd Z	d	d
 Z
dd ZdS )BinaryFileReaderze
    A mixin for readers that ensures that a file or a path can be passed in to the constructor.
    FrbNc             C   s2   t |tr||| j}d| _n
|r(d| _|| _dS )z
        The file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).
        TN)
isinstancestrmode_close_on_exit_file)selffileopener_close_file r   ]/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/dnaio/readers.py__init__   s    
zBinaryFileReader.__init__c             C   s$   | j r | jd k	r | jj  d | _d S )N)r   r   close)r   r   r   r   r   !   s    
zBinaryFileReader.closec             C   s   | j d krtd| S )Nz(I/O operation on closed BinaryFileReader)r   
ValueError)r   r   r   r   	__enter__&   s    
zBinaryFileReader.__enter__c             G   s   | j   d S )N)r   )r   argsr   r   r   __exit__+   s    zBinaryFileReader.__exit__)__name__
__module____qualname____doc__r   Zpairedr   r   r   r   r   r   r   r   r   r   r
      s   r
   c                   s2   e Zd ZdZdeedf fdd	Zdd Z  ZS )r   z!
    Reader for FASTA files.
    FNc                s0   t  j|||d || _d| _|r&dnd| _dS )z
        file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).

        keep_linebreaks -- whether to keep newline characters in the sequence
        )r   r   F
 N)superr   sequence_classdelivers_qualities
_delimiter)r   r   Zkeep_linebreaksr$   r   r   )	__class__r   r   r   4   s    zFastaReader.__init__c             c   s   d}g }t j| j}xt|D ]\}}|j }|s4q|rv|d dkrv|dk	rd| j|| jj|dV  |dd }g }q|r|d dkrqq|dk	r|j| qt	dj
t||dqW |dk	r| j|| jj|dV  |j  dS )zI
        Read next entry from the file (single entry at a time).
        Nr   >r   #z2Expected '>' at beginning of record, but got {!r}.)line)ioTextIOWrapperr   	enumeratestripr$   r&   joinappendr	   format_shortendetach)r   nameseqfir*   r   r   r   __iter__@   s,    zFastaReader.__iter__)	r   r   r   r    r   r   r   r8   __classcell__r   r   )r'   r   r   /   s   c                   s2   e Zd ZdZededf fdd	Zdd Z  ZS )r   zJ
    Reader for FASTQ files. Does not support multi-line FASTQ files.
    i   Nc                s   t  j|||d || _d| _|| _t| j| j| j| _yt| j| _	| j	dksTt
W n$ tk
rz   d| _	tf | _Y nX dS )zx
        file is a filename or a file-like object.
        If file is a filename, then .gz files are supported.
        )r   r   TFN)TF)r#   r   r$   r%   buffer_size_fastq_iterr   _iternextZtwo_headersAssertionErrorStopIterationiter)r   r   r$   r:   r   r   )r'   r   r   r   e   s    zFastqReader.__init__c             C   s   | j S )N)r<   )r   r   r   r   r8   y   s    zFastqReader.__iter__)	r   r   r   r    r   r   r   r8   r9   r   r   )r'   r   r   `   s   )r    __all__r+   r   Z_corer   r;   r   Z_utilr   r2   
exceptionsr	   r
   r   r   r   r   r   r   <module>   s   "1