如何"clean up",迭代工具组合输出?



我正在尝试通过将每个元素(行(与其他元素(行(组合来合并一些文本文件。

我有这样的东西:

wordlist.txt -> alfa
bravo
charlie
numlist.txt -> 123
234
345
spec.txt -> ?
!
%
$

我正在使用迭代工具来获取组合。

这是我的脚本:

row1 = []
f_w1 = open(dictionary_word, 'r')
for line in f_w1.readlines():
line = line.split()
row1.append(line)
... 
inputdata = row1, row2, row3
combinations = list(itertools.product(*inputdata))
combinations_path = input('Enter a directory to save the combinations file: ')
with open(combinations_path + "userscombinations.txt", 'w') as f:
for s in combinations:
f.write(str(s)+ 'n')
with open(combinations_path + "userscombinations.txt", 'r') as f:
combinations = [line.rstrip('n') for line in f]
print(combinations)

我需要获取单个文件,例如:

combinations.txt -> alfa123?
alfa123!
alfa123%
.......
charlie345$

但是使用迭代工具,我得到类似的东西:

combinations.txt -> (['a'], ['1'], ['?'])
(['a'], ['1'], ['!'])
(['a'], ['1'], ['"'])

假设你有

words = ["alfa", "bravo", "charlie"]
nums = ["123", "456", "789"]
specs = ["?", "!", "%", "$"]

可以使用"".join将每个组合减少为单个字符串。

from itertools import product
combinations = ["".join(x) for x in product(words, nums, specs)]

第一个问题是在读取文件的循环中,特别是在split()中(改用strip()(,所有三个文件都应如下所示:

for line in f_w1.readlines():
line = line.strip()
# use strip instead of split to remove trailing and leading whitespaces
row1.append(line)

然后,要将组合转换为字符串,请使用str.join

combinations = [''.join(comb) for comb in itertools.product(*inputdata)]

输出测试:

['alfa123?', 'alfa123!', 'alfa123%', 'alfa123$', 'alfa234?', 'alfa234!', 'alfa234%', 'alfa234$', 'alfa345?', 'alfa345!', 'alfa345%', 'alfa345$', 'bravo123?', 'bravo123!', 'bravo123%', 'bravo123$', 'bravo234?', 'bravo234!', 'bravo234%','bravo234$', 'bravo345?', 'bravo345!', 'bravo345%', 'bravo345$', 'charlie123?', 'charlie123!', 'charlie123%', 'charlie123$', 'charlie234?', 'charlie234!', 'charlie234%', 'charlie234$', 'charlie345?', 'charlie345!', 'charlie345%', 'charlie345$']

最新更新