如何在 Nim 中打开和读取 .gz 文件(最好是逐行)
How to open and read a .gz file in Nim (preferably line by line)
我刚坐下来编写我的第一个 Nim
脚本来解析 .vcf
(变体调用格式)文件。此文件格式存储来自测序数据的基因突变。
对于脚本语言,我 'grew up' 在 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()
看过相关的问题,但不是很清楚。这些帖子也相对较旧,我 hope/suspect 出现了更好的东西。这是我发现的:
非常感谢。
P.S。 我还认为如果有人在 Whosebug 中创建一个 Nim
标签会很有用。我没有创建标签的声誉。
前段时间我尝试使用 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 的建议,我查看了 tests for the Nim 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
以防万一您需要处理 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
脚本来解析 .vcf
(变体调用格式)文件。此文件格式存储来自测序数据的基因突变。
对于脚本语言,我 'grew up' 在 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()
看过相关的问题,但不是很清楚。这些帖子也相对较旧,我 hope/suspect 出现了更好的东西。这是我发现的:
非常感谢。
P.S。 我还认为如果有人在 Whosebug 中创建一个 Nim
标签会很有用。我没有创建标签的声誉。
前段时间我尝试使用 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 的建议,我查看了 tests for the Nim 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
以防万一您需要处理 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 的超快覆盖工具实用程序)。