【发布时间】:2020-09-14 07:36:50
【问题描述】:
这是我的基本问题:
我有以下几点: 文件名:parseFastq.py 执行:通过命令行 运行它的代码:python3 parseFastq.py --fastq /Users/remaining_dir/test1.fastq
此代码有效!!!
但是,当我复制 parseFastq.py 的组件时,就会出现问题。
下面是代码:
首先定义类...这部分可以在我的新脚本上正常运行。
import argparse
import gzip
#Example use is
# python parseFastq.py --fastq /Users/remaining_dir/test1.fastq
################################################
# You can use this code and put it in your own script
class ParseFastQ(object):
"""Returns a read-by-read fastQ parser analogous to file.readline()"""
def __init__(self,filePath,headerSymbols=['@','+']):
"""Returns a read-by-read fastQ parser analogous to file.readline().
Exmpl: parser.__next__()
-OR-
Its an iterator so you can do:
for rec in parser:
... do something with rec ...
rec is tuple: (seqHeader,seqStr,qualHeader,qualStr)
"""
if filePath.endswith('.gz'):
self._file = gzip.open(filePath)
else:
self._file = open(filePath, 'rU')
self._currentLineNumber = 0
self._hdSyms = headerSymbols
def __iter__(self):
return self
def __next__(self):
"""Reads in next element, parses, and does minimal verification.
Returns: tuple: (seqHeader,seqStr,qualHeader,qualStr)"""
# ++++ Get Next Four Lines ++++
elemList = []
for i in range(4):
line = self._file.readline()
self._currentLineNumber += 1 ## increment file position
if line:
elemList.append(line.strip('\n'))
else:
elemList.append(None)
# ++++ Check Lines For Expected Form ++++
trues = [bool(x) for x in elemList].count(True)
nones = elemList.count(None)
# -- Check for acceptable end of file --
if nones == 4:
raise StopIteration
# -- Make sure we got 4 full lines of data --
assert trues == 4,\
"** ERROR: It looks like I encountered a premature EOF or empty line.\n\
Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._currentLineNumber)
# -- Make sure we are in the correct "register" --
assert elemList[0].startswith(self._hdSyms[0]),\
"** ERROR: The 1st line in fastq element does not start with '%s'.\n\
Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._hdSyms[0],self._currentLineNumber)
assert elemList[2].startswith(self._hdSyms[1]),\
"** ERROR: The 3rd line in fastq element does not start with '%s'.\n\
Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._hdSyms[1],self._currentLineNumber)
# -- Make sure the seq line and qual line have equal lengths --
assert len(elemList[1]) == len(elemList[3]), "** ERROR: The length of Sequence data and Quality data of the last record aren't equal.\n\
Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._currentLineNumber)
# ++++ Return fatsQ data as tuple ++++
return tuple(elemList)
##########################################################################
这是在同一脚本中调用时不起作用的代码;它与放入碎片有关:
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process fasq files and seperaate into 4 categories')
parser.add_argument("-f", "--fastq", required=True, help="Place fastq inside here")
args = parser.parse_args()
fastqfile = ParseFastQ(args.fastq)
我尝试了以下方法,但无法获取包含以下元组的 fastqfile:(seqHeader,seqStr,qualHeader,qualStr)
尝试:
parser.add_argument("-/Users/remaining_dir/test1.fastq", "--fastq", required=True, help="Place fastq inside here")
错误:
argument -/Users/remaining_dir/test1.fastq/--fastq: conflicting option string: --fastq
尝试:
parser.add_argument("-/Users/remaining_dir/test1.fastq", "-@", required=True, help="Place fastq inside here")
输出[332]:
_StoreAction(option_strings=['-/Users/remaining_dir/test1.fastq', '-@'], dest='/Users/remaining_dir/test1.fastq', nargs=None, const=None, default=None, type=None, choices=None, help='Place fastq inside here', metavar=None)
下一行:
错误:
usage: [-h] -/Users/remaining_dir/test1.fastq
/USERS/REMAINING_DIR/TEST1.FASTQ
: error: the following arguments are required: -/Users/remaining_dir/test1.fastq/-@
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
when %tb selected the following info was give:
File "/Users/brownbear/opt/anaconda3/lib/python3.7/argparse.py", line 2508, in error
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
File "/Users/brownbear/opt/anaconda3/lib/python3.7/argparse.py", line 2495, in exit
_sys.exit(status)
如果有帮助,我会附上一些示例 fastq 数据
@seq13534-419
GCAGTAGCGGTCATAAGTGGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGAGGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGTGTCGTGAGGTGACGTCCGTCACTGGACGAA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFFFFDFFDFFDDFDFDFFFFDDFFDDFDDFF
@seq86249-867
GGATTAGCGGTCATAAGTCGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGAGGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGAGGTCAGTATAACCTCTCAAAGCTTTATCTACGGATGGATCCGCGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDDFDDDDDDFFDFDDFDDDFDFFDDFFFFFFFFFDDFDFFDDFDDF
@seq46647-928
GACCTAGCGGTCATAAGTGGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGACGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGTAAGTAAATGCCACGGACTCGTCACGTG
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDDDFDFDFFFFFDFFDFDFDDDDDFDFF
如果我在运行脚本但现在尝试合并到脚本中时,任何帮助将不胜感激
【问题讨论】:
-
当您说
This is the code that will not work when calling it in the same script; it has to do with putting the pieces in以及在展示尝试其他事物的示例之后立即不清楚您的意思。你试试第一个代码sn-p吗?如果有的话,它会给出什么错误或输出?它的缩进与您显示的完全一样吗? -
脚本A,为原创脚本,可在线命令调用。脚本A的所有内容都将复制到脚本B。在脚本B上逐行运行时出现错误。该类运行顺利;但是,当您尝试使用 agparse 添加 var-args 时,它会失败:
-
带有
if __name__ == "__main__":的代码sn-p 是脚本A 的一部分吗?如果是这样,它在脚本 A 中是否有效? -
@Axe319 它运行良好
-
以这个工作示例
parser.add_argument("-f", "--fastq", required=True, help="Place fastq inside here")为例。所有这一切都是说,您可以从命令行指定python my_script.py -f /my/file/path或python my_script.py --fastq /my/file/path,然后在使用args = parser.parse_args()解析参数后,args.fastq变量将保存您传递给它的任何字符串。在这个例子中/my/file/path.
标签: python-3.x integration argparse runpy