首先,如果我看起来一无所知,我很抱歉。我在一周前就知道编程没什么,但是现在我已经看到了它的技能有多么宝贵,我想学习如何在我们的科学实验室里做一些程序员的事情。无论如何,背景足够。
他提出的最有用的程序之一需要一个pdb文件(本质上是一个大的,1000多行文本文件),并且仅根据他想要查看的内容过滤掉以某个单词开头的行。每行具有相同的格式/长度,以便更容易。在对这些单词进行过滤后,他会拉出与该行相关的数据并使用它进行计算。示例行将是:
ATOM 1 N MET A 1 36.886 53.177 ... (more data)
所以我的问题是这样的:他建议查看argparse以帮助过滤,但我不能为我的生活理解argparse帮助或教程。这是否可能,如果可以,那么精彩的人可能会帮助我指出正确的方向吗?谢谢!
答案 0 :(得分:3)
注意:此答案与如何扫描PDB文件以获取关键字的问题无关,但基本上说明了 argparse
包的内容可以做。
当你的朋友说argparse将帮助过滤PDB文件"时,它更多的是帮助创建一个用户友好的程序来过滤PDB文件。
如果没有argparse
,人们可以编写如下代码:
import sys
keyword = sys.argv[2]
pdb_file = sys.argv[1]
# and then go on using it, say you already have a PDB file scanning function
search_pdb_with_keyword(pdb_file, keyword)
如果用户尝试使用您的Python脚本而未指定任何参数,则他或她会:
$ python pdb_search.py
Traceback (most recent call last):
File "pdb_search.py", line 3, in <module>
keyword = sys.argv[2]
IndexError: list index out of range
除非他对Python有所了解,否则此错误可能会让用户感到困惑并且根本没有用处。即使有这个错误,用户也不知道:
通过编写一些简单的验证,您可以(略微)改进上述不良做法:
from __future__ import print_function
import sys
import os
if len(sys.argv) == 3:
pdb_file = sys.argv[1]
keyword = sys.argv[2]
if keyword not in ("ATOM", "HETATM"):
print("Invalid keyword!", file=sys.stderr)
sys.exit(1) # abort
if not os.path.exists(pdb_file):
print("File {} does not exist.".format(pdb_file), file=sys.stderr)
sys.exit(1)
else:
print("Usage: {} <pdb_file> <ATOM|HETATM>", file=sys.stderr)
sys.exit(1)
search_pdb_with_keyword(pdb_file, keyword)
想象一下,如果你有多个参数,每个参数都有自己的特定要求,那么你最终会编写很多if
个条款,而且这些条款很乏味且容易出错。
因此,您需要argparse
来定义程序接受的参数以及argparse
如何验证它们。
from argparse import ArgumentParser
parser = ArgumentParser(description="PDB keyword search program.")
parser.add_argument("pdb_file", type=file, help="A PDB file as input.")
parser.add_argument("keyword", choices=("ATOM", "HETATM"), help="Keyword to search for")
# argparse will validate the user's arguments for you, checking if two arguments are
# specified and if the first argument is an existing file and if the second argument
# is either ATOM or HETATM
args = parser.parse_args()
search_pdb_with_keyword(args.pdb_file, args.keyword)
如果用户错误地运行程序,请说
$ python pdb_search.py pdb_file # lacking the keyword
将弹出错误:
$ python pdb_search.py
usage: pdb_search.py [-h] pdb_file {ATOM,HETATM}
pdb_search.py: error: too few arguments
它表明你的程序有多少参数和它们是什么。
它甚至会为您格式化使用信息:
$ python pdb_search.py -h
usage: pdb_search.py [-h] pdb_file {ATOM,HETATM}
PDB keyword search program.
positional arguments:
pdb_file A PDB file as input.
{ATOM,HETATM} Keyword to search for
optional arguments:
-h, --help show this help message and exit
但如果你想了解更多关于如何使用它的信息以及它与你的用例如何相关,你应该read the argparse
documentation。
您可以将其他人的答案作为我在代码中使用的虚拟函数search_pdb_with_keyword
的实现。
答案 1 :(得分:2)
我觉得这里有些混乱。
Argparse是Python附带的一个库,它允许您接收并轻松处理命令行参数 - 基本上,它们使您可以更轻松地创建其他人在运行程序时可以使用的界面。
过滤文本文件的任务与argparse完全正交。如果有帮助,您可以将argparse视为在运行程序之前获取信息和配置选项的一种方式。实际过滤的任务是您必须自己编写的。
不知道命令行是什么?这是good intro。这是关于如何使用命令行的tutorial。
答案 2 :(得分:0)
来自argparse
的文档:
argparse
模块可以轻松编写用户友好的命令行界面。该程序定义了它需要的参数,argparse将弄清楚如何解析sys.argv中的参数。
在python中解析文件有更好的替代方法。例如,您可以:
with open('file', 'r') as f:
for line in f:
if line.startswith('ATOM'):
print line
如果您想检查多个关键字,请考虑检查re
的模块regular expressions:
import re
keywords = ['ATOM', 'TOM', 'OM']
pattern = re.compile('^(?:' + '|'.join(keywords) + ').*$', re.MULTILINE)
with open('DATA', 'r') as f:
for line in pattern.findall(f.read()):
print line