2015-04-12 2 views
2

У меня есть список в Python с 4-х элементов, которые все сами списки строк (текст)Looping над списком списков и сохранение различных файлов

Я хочу, чтобы сохранить эти элементы в пронумерованных имен файлов.

for n in textblock: 
    for line in textblock[n]: 
     with open('file_{0}.dat'.format(n),'w') as ffile: 
      ffile.write(textblock[n[line]]) 
      ffile.close() 

Я получаю сообщение об ошибке:

for line in textblock[n]: 
    TypeError: list indices must be integers, not list 

Любой намек на то, что я могу сделать, чтобы исправить это?

+0

Во второй строке вы должны изменить его на длину текстового блока [n]. –

ответ

1

Если вы перебор ваших textblock с for n in textblock:, то n примет значение каждого элемента в textblock (так n является list). Затем, если вы попытаетесь получить textblock[n], вы пытаетесь использовать список n в качестве индекса.

Вы можете просто:

for x in textblock: 
    for line in x: 
     # do stuff with the line 

Не пробуйте и близко ffile - она ​​закрыта автоматически with блока.

Если вы хотите использовать индекс в имени файла, я думаю, что вы хотите что-то вроде этого:

for i, lines in enumerate(textblock): 
    with open('file_{0}.dat'.format(i),'w') as ffile: 
     for line in lines: 
      ffile.write(line) 

enumerate даст вам индекс и элементы, как вы итерацию по списку.

+0

, но если я сделаю это так, то мое имя файла станет содержимым моего элемента, и поэтому слишком долго очевидно. Я хочу, чтобы в нем было простое число –

+0

См. Редактирование моего ответа. – khelwood

1

Вы можете использовать enumerate

for n,m in enumerate(textblock, 1): 
    with open('file_{0}.dat'.format(n),'w') as ffile: 
     for line in m: 
      ffile.write(line) 

Примечание

  • with open позаботится close().
  • for i in [1,2,3] дает 1,2,3 в каждой потребности iteration .Но из [1,2,3][i]
1

Поясним структуру данных. Это звучит так:

outer_list = [ ["STRING1", "STRING2", ...], 
       ["STRING1", "STRING2", ...], 
       ["STRING1", "STRING2", ...], 
       ["STRING1", "STRING2", ...] 
      ] 

Итак, давайте использовать Питон итерацию для структуры петли для прохождения внешнего списка.

for inner_list in outer_list: 

Но мы хотим, чтобы записать содержимое каждого inner_list в файл, используя позицию inner_list в outer_list. Давайте используем встроенную функцию enumerate(), чтобы получить позицию.

for n, inner_list in enumerate(outer_list, 1): 
    # write inner list to file 

Давайте рассмотрим запись файла inner_list в файл.

with open('file_{0}.dat'.format(n),'w') as ffile: # this is fine, well done. 
    ffile.write(inner_list) 

Все вместе это было бы:

for n, inner_list in enumerate(outer_list, 1): 
    with open('file_{0}.dat'.format(n),'w') as ffile: 
     ffile.write(inner_list) 
     # no need to close the file, the with syntax does this for you. 

EDIT: Существует еще один шаг, необходимый здесь, как отметил @mhawke

The write() метод требует, чтобы передать строку , Мы можем легко конвертировать наш inner_list в строку. Мой предпочтительный метод заключается в использовании метода join(). Мы можем указать, что мы соединим каждую строку в inner_list с новой строки, так что он будет печатать красиво, т.е.

'\n'.join(inner_list) 

Поэтому наше окончательное решение будет:

for n, inner_list in enumerate(outer_list, 1): 
    with open('file_{0}.dat'.format(n),'w') as ffile: 
     ffile.write('\n'.join(inner_list)) 
+0

'ffile.write (inner_list)' не будет работать - 'write()' требует строку, а не список. Вместо этого вы можете использовать 'writelines()', если исходные строки заканчиваются новыми строками (или вам не нужны новые строки в выходных файлах). В противном случае вам нужно будет перебирать строки в каждом подсписке и выводить строку с новой строкой, например. 'Ffile.write ('{} \ n'.format (строка))'. – mhawke

0

Если вы хотите написать списки списков используют модуль csv:

import csv 

for ind, lsts in enumerate(textblock): 
    with open('file_{0}.dat'.format(ind),'w') as ffile: 
     wr = csv.writer(file) 
     wr.writerows(lsts)  
Смежные вопросы