【问题标题】:Counting the command line arguments and removing the not needed one in python计算命令行参数并删除python中不需要的参数
【发布时间】:2022-01-01 04:32:40
【问题描述】:

我想编写将使用以下命令运行的 python 代码:

python3 myProgram.py 4 A B C D stemfile

其中4是文件数,A,B,C,D是4个文件。然后我想生成A,B,C,D的所有组合,除了空的。(A, B, C, D, AB, AC, AD, BC, BD, CD, ABC, ABD, ACD, BCD, ABCD)但在此之前它将读取stemfile.names 并且如果stemfile.names 有一行| Final Pseudo Deletion Count is 0. 那么它只会生成上述15个组合,否则它会说noisy data 并且不会打印3个文件的组合并且不考虑D。所以输出将是:(A, B, C, AB, AC, BC, ABC)

所以在我的代码中,我总是将 D 作为最后一个文件参数,并少运行 1 次循环。但 D 仅是最后一个参数并不总是正确的。可以是:python3 myProgram.py 4 B D C A stemfile

在这种情况下,在我的代码中,在进行组合时不会考虑 A,但是每当在 stemfile.names 中找不到该行时,我只想从等式中删除 D 文件。我该怎么做?

稍后在该代码中,当仅组合为 A 时,它将 A 存储在单独的输出文件中,每当它是 AB 时,它将 A、B 文件的并集存储在单独的文件中,依此类推所有组合.在这里,如果有噪声数据,那么该 D 文件将不会出现在任何输出文件中。

再举一个例子,如果我给:python3 myProgram.py 3 A D B stemfile

stemfile.names 没有| Final Pseudo Deletion Count is 0. 行,则输出组合为:A,B,AB,它只会创建2 个输出文件。

下面附上我的代码:

import sys
import itertools
from itertools import combinations


def union(files):
    lines = set()
    for file in files:
        with open(file) as fin:
            lines.update(fin.readlines())
    return lines


def main():
    number = int(sys.argv[1])
    dataset = sys.argv[number+2]

    with open(dataset+'.names') as myfile:
        if '| Final Pseudo Deletion Count is 0.' in myfile.read():
            a_list = sys.argv[2:number+2]
            print("All possible combinations:\n")
            for L in range(1, len(a_list)+1):
                 for subset in itertools.combinations(a_list, L):
                     print(*list(subset), sep=',')
            print("...............................")
            matrix = [itertools.combinations(a_list, r) 
                      for r in range(1, len(a_list) + 1)]
            combinations = [c for combinations in matrix for c in combinations]
            for combination in combinations:
                filenames = [f'{name}' for name in combination]
                output = f'{"".join(combination)}_output'
                print(f'Writing union of {filenames} to {output}')
                with open(output, 'w') as fout:
                    fout.writelines(union(filenames))

        else:
            a_list = sys.argv[2:number+1]
            # Here I am reducing a number only
            
            print("Noisy data.\n")
            print("So all possible combinations:\n")

            for L in range(1, len(a_list)+1):
                for subset in itertools.combinations(a_list, L):
                    print(*list(subset), sep=',')
            print("................................")
            matrix = [itertools.combinations(a_list, r)
                      for r in range(1, len(a_list) + 1)]
            combinations = [c for combinations in matrix for c in combinations]
            for combination in combinations:
                filenames = [f'{name}' for name in combination]
                output = f'{"".join(combination)}_output'
                print(f'Writing union of {filenames} to {output}')
                with open(output, 'w') as fout:
                    fout.writelines(union(filenames))


if __name__ == '__main__':
    main()

请帮帮我。

【问题讨论】:

  • 我认为,当您可以使用 argparse 库时,您会付出相当多的努力来解析命令行参数。我现在没有时间写一个完整的答案。现在,请阅读 argparse 库,看看您是否可以自己解决。我今天晚些时候再回来看看你是否还需要帮助。提示:nargs='+'

标签: python python-3.x file command-line-arguments


【解决方案1】:

我认为您应该将其分解为更小、更具体的问题。似乎这里有很多细节没有关注您面临的具体问题。但是,我对您的问题进行了尝试。

认为您正试图弄清楚如何从命令行参数中删除项目。如果是这种情况,您对传递给程序的内容无能为力,但您可以在解析后修改输入列表。正如我在评论中所说,我真的认为您应该尝试阅读有关 argparse 库的信息。我不确定它是否正是您要查找的内容,但这里有一些使用 argparse 的代码,它需要每个输入文件的完整文件名。最后一个参数必须是 stemfile。

解析参数后,您将获得pathlib.Path 对象的列表。您可以简单地从列表中删除 D 文件。

import argparse
import itertools
import pathlib

NOISY_DATA_LINE = '| Final Pseudo Deletion Count is 0.'

def get_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument('filenames', type=pathlib.Path, nargs='+')
    parser.add_argument('stemfile', type=pathlib.Path)
    return parser

def union(files):
    lines = set()
    for file in files:
        with open(file) as fin:
            lines.update(fin.readlines())
    return lines

def main():
    parser = get_parser()
    args = parser.parse_args()

    stemfile_lines = args.stemfile.read_text().splitlines()
    if stemfile_lines[-1] == NOISY_DATA_LINE:
        filenames = [p for p in args.filenames if p.stem != 'D']
    else:
        filenames = args.filenames

    matrix = [itertools.combinations(filenames, r) for r in range(1, len(filenames) + 1)]
    combinations = [c for combinations in matrix for c in combinations]
    print(' '.join([str([p.stem for p in c]) for c in combinations]))
    for combination in combinations:
        output = f'{"".join([p.stem for p in combination])}_output.txt'
        print(f'Writing union of {[p.stem for p in combination]} to {output}')
        with open(output, 'w') as fout:
            fout.writelines(union(filenames))

if __name__ == '__main__':
    main()

【讨论】:

  • 知道了。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2021-02-26
  • 2012-03-06
  • 2011-03-29
  • 2012-02-20
相关资源
最近更新 更多