【问题标题】:How to open and read a .gz file in Nim (preferably line by line)如何在 Nim 中打开和读取 .gz 文件(最好是逐行)
【发布时间】:2019-08-08 20:51:16
【问题描述】:

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

对于脚本语言,我在Perl 上“长大”,后来迁移到Python,但我很想使用Nim 提供的速度的语言。我意识到Nim 还很年轻,但我什至找不到一个清晰的例子来说明如何打开和读取.gz (gzip) 文件(最好是逐行)。

谁能提供一个简单的例子来逐行使用Nim打开和读取gzip文件?

Python,我习惯了下面的(超级简单的)代码:

import gzip

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

my_file.close()

我看过相关的问题,但不清楚。这些帖子也相对较旧,我希望/怀疑有更好的事情发生。这是我发现的:

  1. Read gzip-compressed file line by line
  2. File, FileStream, and GZFileStream
  3. Reading files from tar.gz archive in Nim

真的很感激。

附: 我还认为,如果有人在 StackOverflow 中创建了一个 Nim 标签,那将会很有用。我没有创建标签的声誉。

【问题讨论】:

  • 官方有zip wrapper。你可能想看看tests
  • Nim 标签前几天更名为 Nim-lang。
  • @xbello,谢谢。这一定是他们不让像我这样的“不知名”角色创建新标签的原因。 ??????

标签: gzip bioinformatics nim-lang vcf-variant-call-format


【解决方案1】:

以防万一您需要处理 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 的超快速覆盖工具实用程序)。

【讨论】:

    【解决方案2】:

    根据 Maurice Meyer 的建议,我查看了 testsNim zip package。结果很简单。这是我的第一个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 package library中了:

    > nimble refresh
    > nimble install zip
    

    【讨论】:

      【解决方案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 的安装。

      【讨论】:

      • 感谢您的建议。 Maurice Meyer 向我指出了一个简单的例子。
      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2020-01-29
      • 2019-04-17
      相关资源
      最近更新 更多