2

我只是坐下来编写我的第一个Nim脚本来解析.vcf(变体调用格式)文件。这种文件格式存储来自测序数据的基因突变。

对于脚本语言,我PerlPythonNim. 我意识到我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. 文件、文件流和 GZFileStream
  3. 从 Nim 中的 tar.gz 存档中读取文件

真的很感激。

PS我也认为如果有人Nim在 StackOverflow 中创建标签会很有用。我没有创建标签的声誉。

4

3 回答 3

2

以防万一您需要处理 VCF 而不是 .gz,Brent Pedersen 为htslib编写了一个很好的包装器:

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

您需要htslib在您的系统中安装 ,然后在您的.nimble文件中使用需要库requires "hts",或者使用nimble install hts. 如果您要在 Nim 中进行 NGS 分析,您将需要它。

您需要的代码:

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 字段时。

查看整个布伦特回购协议。它有大量的包装器、代码示例和实用程序来处理 NGS 问题(例如,一个名为Mosdepth的超快速覆盖工具实用程序)。

于 2019-08-10T13:23:40.353 回答
1

根据 Maurice Meyer 的建议,我查看了Nim zip 包的测试。结果很简单。这是我的第一个脚本,所以如果我没有遵守约定等,我深表歉意。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
于 2019-08-09T22:41:50.627 回答
0

我前段时间尝试使用 Nim 来解析 fastq 或 fastq.gz 文件。

代码应在此处提供: https ://gitlab.pasteur.fr/bli/qaf_demux/blob/master/Nim/src/qaf_demux.nim

我不记得它究竟是如何工作的,但显然,我做了一个import zip/gzipfilesnewGZFileStream在输入文件名上使用来获取可以在这段代码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.

于 2019-08-09T17:00:08.723 回答