如何在csv阅读器python中迭代字符

时间:2018-06-06 02:45:37

标签: python loops csv character

我有许多文本文件(.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')

2 个答案:

答案 0 :(得分:1)

您可以以相同的方式迭代任何迭代。它不一定是range; for i in range(3):for i in [1, 2, 3]:做同样的事情。并且值不必是整数 - 您可以for i in ['A', 'B', 'C']。或者,更简单地说,字符串本身就是一个可迭代的字符,所以for i in 'ABC':

而且,虽然我们处于此状态,但这意味着您可以直接遍历列表JobSizeIteration。不要使用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:

如果JobSizeIteration的元素不是字符串,那么最后一个版本将不起作用 - 但如果你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