如何在 Nim 中打开和读取.gz文件(最好是逐行)



我只是坐下来编写我的第一个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. 逐行读取 gzip 压缩文件
  2. File、FileStream 和 GZFileStream
  3. 从 tar 读取文件.gz Nim 存档

真的很感激。

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

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

根据莫里斯·迈耶的建议,我查看了 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

前段时间我尝试使用 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的安装.

最新更新