Проблема с Gzip, трассировка и IOError: [Errno 2] Нет такого файла или каталога - PullRequest
2 голосов
/ 26 июня 2011

Я новичок в области питона и биоинформатики. Я использую Python-2.6. Теперь я пытаюсь выбрать все файлы fastq.gz, затем gzip.open (всего несколько строк, потому что он слишком большой и тратит время), затем посчитать 'J', а затем выбрать эти файлы с количеством 'J', НЕ равным до 0.

Вот мой код:

#!/usr/bin/python

import os,sys,re,gzip

path = "/home/XXX/nearline"

for file in os.listdir(path):
  if re.match('.*\.recal.fastq.gz', file):
    text = gzip.open(file,'r').readlines()[:10]
    word_list = text.split()
    number = word_list.count('J') + 1
    if number !== 0:
      print file

Но я получил несколько ошибок:

Traceback (most recent call last):
  File "fastqfilter.py", line 9, in <module>
    text = gzip.open(file,'r').readlines()[:10]
  File "/share/lib/python2.6/gzip.py", line 33, in open
    return GzipFile(filename, mode, compresslevel)
  File "/share/lib/python2.6/gzip.py", line 79, in __init__
    fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
IOError: [Errno 2] No such file or directory: 'ERR001268_1.recal.fastq.gz'

Что это за трассировка: Файл ...... Что-то не так с gzip? И почему он не может найти ERR001268_1.recal.fastq.gz? Это первый файл fastq в списке, и он там существует.

Надеюсь, дайте мне несколько подсказок и укажите на любые другие ошибки в сценарии.

Большое спасибо.

Редактировать: спасибо всем. Я последовал предложению Дэна. И я сначала попробовал ОДИН файл fastq. Мой сценарий выглядит так:

#!/usr/bin/python

import os,sys
import gzip
import itertools

file = gzip.open('/home/xug/nearline/ERR001274_1.recal.fastq.gz','r')
list(itertools.islice(file.xreadlines(),10))
word_list = list.split()
number = word_list.count('J') + 1
if number != 0:
  print 'ERR001274_1.recal.fastq.gz'

Тогда ошибки:

Traceback (most recent call last):
  File "try2.py", line 8, in <module>
    list(itertools.islice(text.xreadlines(),10))
AttributeError: GzipFiles instance has no attribute 'xreadlines'

Снова отредактируйте: Спасибо, Дэн, я вчера решил проблему. Кажется, GzipFiles не поддерживает xreadlines. Поэтому я попробовал аналогичный способ, как вы предложили позже И это работает. Смотрите ниже:

#!/usr/bin/python

import os,sys,re
import gzip
from itertools import islice

path = "/home/XXXX/nearline"

for file in os.listdir(path):
  if re.match('.*\.recal.fastq.gz', file):
    fullpath = os.path.join(path, file)
    myfile = gzip.open(fullpath,'r')
    head = list(islice(myfile,1000))
    word_str = ";".join(str(x) for x in head)
    number = word_str.count('J')
    if number != 0:
      print file

Ответы [ 3 ]

4 голосов
/ 26 июня 2011

в этой строке:

text = gzip.open(file,'r').read()

file - это имя файла, а не полный путь, поэтому

fullpath = os.path.join(path, file)
text = gzip.open(fullpath,'r').read()

о F.readlines()[:10] будет считывать весь файл всписок строк, а затем взять первые 10

import itertools
list(itertools.islice(F.xreadlines(),10))

, при этом весь файл не будет считан в память, а будут прочитаны только первые 10 строк в список


, но какgzip.open возвращает объект, который не имеет .xreadlines (), но поскольку файлы итерируемы в своих строках, просто:

list(itertools.islice(F,10))

будет работать, как показывает этот тест:

>>> import gzip,itertools
>>> list(itertools.islice(gzip.open("/home/dan/Desktop/rp718.ps.gz"),10))
['%!PS-Adobe-2.0\n', '%%Creator: dvips 5.528 Copyright 1986, 1994 Radical Eye Software\n', '%%Title: WLP-94-int.dvi\n', '%%CreationDate: Mon Jan 16 16:24:41 1995\n', '%%Pages: 6\n', '%%PageOrder: Ascend\n', '%%BoundingBox: 0 0 596 842\n', '%%EndComments\n', '%DVIPSCommandLine: dvips -f WLP-94-int.dvi\n', '%DVIPSParameters: dpi=300, comments removed\n']
1 голос
/ 26 июня 2011

Измените свой код на:

#!/usr/bin/python

import os,sys,re,gzip

path = "/home/XXX/nearline"

for file in os.listdir(path):
  if re.match('.*\.recal.fastq.gz', file):
    text = gzip.open(os.path.join(path,file),'r').readlines()[:10]
    word_list = text.split()
    number = word_list.count('J') + 1
    if number !== 0:
      print file
0 голосов
/ 26 июня 2011

Он пытается открыть ERR001268_1.recal.fastq.gz из рабочего каталога, а не из /home/XXX/nearline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...