【发布时间】: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