Как перебрать символ в csv reader python - PullRequest
0 голосов
/ 06 июня 2018

У меня есть несколько текстовых файлов (.txt), первый из которых называется 1_1_A_A, а последний - 10_10_B_C.Первый элемент в именах имеет значение от 1 до 10, второй - от 1 до 10, третий - A или B, а четвертый - A, B или C. Всего 600 экземпляров.Я хочу, чтобы Python читал их с помощью CSV Reader.Для первых двух элементов я использую %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 голосов
/ 06 июня 2018

Вы можете перебирать любую итерацию одинаково.Это не должно быть 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?

0 голосов
/ 06 июня 2018

Вы можете выполнять итерацию по любой итерируемой, включая строки, такие как:

Код:

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
...