gpt4 book ai didi

python - 如何从用户获取文件路径然后传递给函数(argparse)

转载 作者:行者123 更新时间:2023-12-01 06:47:03 29 4
gpt4 key购买 nike

我正在编写一个程序,对文件的内容执行不同的功能。目前,文件存储在变量中并传递给每个函数,如下所示:

file = "path/to/file"

我想要做的是允许用户使用我设置的命令行函数输入路径并将其传递给我的函数。

但是我不确定如何将其实现到我这里的命令行文件中

cli.py

import os, argparse
from . import parse


def validate_file(filename):
if not os.path.exists(filename):
raise argparse.ArgumentTypeError("{0} does not exist".format(filename))
return filename


def dump(filename):
for record in parse.uniprot_records(filename):
print(record)

...
(more function definitions)
...

def cli():
# Create a new parser
parser = argparse.ArgumentParser(description="UniProt Analysis")

# Input file
parser.add_argument("-i", "--input", dest="filename", type=validate_file, required=True, help="enter input file", metavar="FILE")

subparsers = parser.add_subparsers(help="Enter one of the arguments to run function")

# Add subparsers
subparsers.add_parser("dump", help="prints all records").set_defaults(func=dump)

# Parse the command line
args = parser.parse_args()
print(type(args.filename))

# Take the func argument, which points to our function and call it
args.func(args)

所以我希望能够传递该文件,并且还具有我想在命令行中对其执行的功能,例如pipenv运行python程序.py路径/到/文件转储

编辑:向解析器添加了一个参数以获取用户的输入文件。然后将此文件传递到 dump 函数,该函数将文件传递到此函数:

解析.py

import gzip
from Bio import SeqIO


def uniprot_records(f):
records = []

handle = gzip.open(f)
for record in SeqIO.parse(handle, "uniprot-xml"):
records.append(record)
return records

我的主要函数位于一个单独的模块中,它只调用 cli 函数。当我尝试通过执行 pipenv run python uniplot.py -i path/to/file dump 来运行它时,它给出以下错误:

文件“/Users/john/workspace/practical-2/uniplot/parse.py”,第 24 行,uniprot_records 中 句柄 = gzip.open(file_location)

文件“/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/gzip.py”,第 57 行,打开raise TypeError("文件名必须是 str 或 bytes 对象,或者文件")

类型错误:文件名必须是 str 或 bytes 对象,或者文件

dump 在使用 gzip 解压缩给定文件后,应该简单地打印出给定文件的全部内容。

最佳答案

请使用以下语法。

import argparse, os
from argparse import ArgumentParser


def validate_file(f):
if not os.path.exists(f):
# Argparse uses the ArgumentTypeError to give a rejection message like:
# error: argument input: x does not exist
raise argparse.ArgumentTypeError("{0} does not exist".format(f))
return f


if __name__ == "__main__":

parser = ArgumentParser(description="Read file form Command line.")
parser.add_argument("-i", "--input", dest="filename", required=True, type=validate_file,
help="input file", metavar="FILE")
args = parser.parse_args()
print(args.filename)

关于python - 如何从用户获取文件路径然后传递给函数(argparse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59178961/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com