Nano Hash - криптовалюты, майнинг, программирование

Как открыть и прочитать файл .gz в Nim (желательно построчно)

Я только что сел писать свой первый Nim скрипт для разбора файла .vcf (вариантный формат вызова). В этом формате файла хранятся генетические мутации из данных секвенирования.

Что касается языков сценариев, я «вырос» на Perl, а затем перешел на Python, но мне бы хотелось использовать язык с той скоростью, которую предлагает Nim. Я понимаю, что Nim еще молод, но я даже не смог найти четкого примера того, как открыть и прочитать файл .gz (gzip) (желательно построчно).

Кто-нибудь может привести простой пример открытия и чтения файла gzip с помощью Nim построчно?

В Python я привык к следующему (очень простому) коду:

import gzip

my_file = gzip.open('my_file.vcf.gz', 'w')
for line in my_file:
    # do something

my_file.close()

Я видел связанные вопросы, но они не ясны. Сообщения также относительно старые, и я надеюсь/подозреваю, что появилось что-то лучшее. Вот что я нашел:

  1. Построчно читать сжатый gzip файл
  2. Файл, FileStream и GZFileStream
  3. Чтение файлов из архива tar.gz в Nim

Действительно ценю это.

P.S. Я также думаю, что было бы полезно, если бы кто-нибудь создал тег Nim в StackOverflow. У меня нет репутации для создания тегов.


  • Существует официальная zip-оболочка. Возможно, вы захотите взглянуть на тесты. 09.08.2019
  • Несколько дней назад тег Nim был переименован в Nim-lang. 10.08.2019
  • @xbello, спасибо. Должно быть, поэтому они не позволяют «непорядочным» персонажам вроде меня создавать новые теги. ???? 10.08.2019

Ответы:


1

На тот случай, если вам нужно работать с VCF, а не с .gz, есть хорошая оболочка для htslib, написанная Брентом Педерсеном. :

https://github.com/brentp/hts-nim

Вам необходимо установить htslib в свою систему, а затем потребовать библиотеку в файле .nimble с помощью requires "hts" или установить библиотеку с помощью nimble install hts. Если вы собираетесь проводить анализ NGS в Nim, он вам понадобится.

Код, который вам нужен:

import hts

var v:VCF
doAssert open(v, "myfile.vcf.gz")
# Here you have the VCF file loaded in v, and can access the headers through
#  v.header property

for record in v:
    # Here you get a Record object per line, e.g. extract the Ref and Alts:
    echo v.REF, " ", v.ALT

v.close()

Обязательно следуйте документам, потому что некоторые вещи отличаются от python, особенно при получении полей INFO и FORMAT.

Ознакомьтесь со всем репозиторием Brent. Он содержит множество оболочек, примеров кода и утилит для решения проблем NGS (например, утилита для сверхбыстрого покрытия под названием Mosdepth).

10.08.2019

2

По предложению Мориса Мейера я просмотрел тесты для zip-пакета Nim. Это оказалось довольно просто. Это мой первый Nim скрипт, поэтому прошу прощения, если не следовал правилам и т. д.

import zip/gzipfiles  # Import zip package

block:
  let vcf = newGzFileStream("my_file.vcf.gz")  # Open gzip file
  defer: outFile.close()  # Close file (like a 'final' statement in 'try' block)

  var line: string  # Declare line variable

  # Loop over each line in the file
  while not vcf.atEnd():
    line = vcf.readLine()

    # Cure disease with my VCF file

Чтобы установить пакет zip, я просто запустил, потому что он уже есть в библиотеке пакетов Nim:

> nimble refresh
> nimble install zip
09.08.2019

3

Некоторое время назад я пытался использовать Nim для разбора файла fastq или fastq.gz.

Код должен быть доступен здесь: https://gitlab.pasteur.fr/bli/qaf_demux/blob/master/Nim/src/qaf_demux.nim

Я точно не помню, как это работает, но, по-видимому, я сделал import zip/gzipfiles и использовал newGZFileStream в имени входного файла, чтобы получить Stream, из которого можно прочитать строки, используя .readLine() в этом фрагменте кода:

proc fastqParser(stream: Stream): iterator(): Fastq =
  result = iterator(): Fastq =
    var
      nameLine: string
      nucLine: string
      quaLine: string
    while not stream.atEnd():
      nameLine = stream.readLine()
      nucLine = stream.readLine()
      discard stream.readLine()
      quaLine = stream.readLine()
      yield [nameLine, nucLine, quaLine]

Он используется в чем-то, что составляет этот фрагмент кода:

let inputFqs = fastqParser(newGZFileStream($inFastqFilename))

Надеюсь, вы сможете адаптировать это к вашему случаю.

Мой файл .nimble имеет расширение requires "zip#head". Я предполагаю, что это вызывает установку zip/gzipfiles.

09.08.2019
  • Спасибо за предложение. Морис Мейер указал мне на простой пример. 10.08.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..