我有许多文本文件(.txt),第一个名为1_1_A_A,最后一个名为10_10_B_C。名称中的第一个元素从1到10,第二个元素从1到10,第三个元素可以是A或B,第四个元素可以是A,B或C.它总共有600个实例。我希望python用CSV阅读器阅读它们。对于前两个元素,我在两个循环中使用%s
并且它正常工作。但是,如何在第三和第四位迭代角色呢?
代码是这样的,迭代第一个两个元素:
for i in range (len(JobSize)):
for j in range(len(Iteration)):
with open('%s_%s_A_A.txt' % (JobSize[i], Iteration[j]), 'rt') as Data:
reader = csv.reader(Data, delimiter='\t')
答案 0 :(得分:1)
您可以以相同的方式迭代任何迭代。它不一定是range
; for i in range(3):
与for i in [1, 2, 3]:
做同样的事情。并且值不必是整数 - 您可以for i in ['A', 'B', 'C']
。或者,更简单地说,字符串本身就是一个可迭代的字符,所以for i in 'ABC':
。
而且,虽然我们处于此状态,但这意味着您可以直接遍历列表JobSize
和Iteration
。不要使用for i in range(len(JobSize)):
然后使用JobSize[i]
,而是直接for i in JobSize:
并使用i
。
所以:
for i in JobSize:
for j in Iteration:
for k in 'AB':
for l in 'ABC':
with open('%s_%s_%s_%s.txt' % (i, j, k, l), 'rt') as Data:
但是,嵌套的四个级别非常难看,并且会将代码从屏幕的右边缘推出。你可能会发现product
更好:
大致相当于嵌套的for循环......嵌套循环像里程表一样循环,最右边的元素在每次迭代时都会前进。
换句话说,这与上面完全相同:
import itertools
for i, j, k, l in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('%s_%s_%s_%s.txt' % (i, j, k, l), 'rt') as Data:
或者,更简单:不要使用元组解压缩来获取单独的i, j, k, l
变量,只需将其保留为单个ijkl
并将其传递给join
:
for ijkl in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('_'.join(ijkl), 'rt') as Data:
如果JobSize
和Iteration
的元素不是字符串,那么最后一个版本将不起作用 - 但如果你map
将它们全部转换为字符串,它的效果就像%s
:
for ijkl in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('_'.join(map(str, ijkl)), 'rt') as Data:
当然,你可能希望得到一个比ijkl
更好的名字。也许name_components
?
答案 1 :(得分:0)
您可以迭代任何可迭代的内容,包括以下字符串:
for i in range(1, 4):
for j in 'abc':
print('{}_{}'.format(i, j))
1_a
1_b
1_c
2_a
2_b
2_c
3_a
3_b
3_c