计算命令行参数并删除 python 中不需要的参数

Counting the command line arguments and removing the not needed one in python

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

python3 myProgram.py 4 A B C D stemfile

其中 4 是文件数,A、B、C、D 是 4 files.Then 我想生成 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 的代码需要每个输入文件的完整文件名。最后一个参数必须是 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()