计算命令行参数并删除 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()
我想使用以下命令编写 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()