2013-04-12 1 views
1

Итак, у меня есть скрипт, который создает файлы, названные для каждого ключа в словаре. (сценарий ниже)Python - Создание пользовательского имени файла во время создания

for key, values in sequencelist.items(): 
    with open(key, 'w') as out: 
     for value in values: 
      out.write('\n'.join(value.split()) + '\n') 

Может ли кто-нибудь помочь мне изменить приведенный выше синтаксис, чтобы сделать больше? Я хотел бы добавить некоторый простой текст в имя файла, а также добавить текущий len(dict.keys()) с помощью range() Смотрите мой скрипт ниже, который не работает! :)

for key, values in sequencelist.items(): 
    for i in range(len(sequencelist.keys())): 
     j = i+1 
     with open('OTU(%j)' +'_' + key +'.txt' %j, 'w') as out: 
      for value in values: 
       out.write('\n'.join(value.split()) + '\n') 

Так что это первый файл, созданный бы ОТ (1) _ key .txt

Я уверен, что with open() линия 100% неправильно.

Может ли кто-то связать меня с материалом, чтобы читать об использовании %j, чтобы вызвать переменную j из строки перед работами? Я пытался использовать код из этого ответа Overflow (Input a text file and write multiple output files in Python) без объяснения причин.

+0

Ваша путаница в отношении '% j', вероятно, произошла из-за того, что код в вопросе, с которым вы связались, использовал« i »как формат (целое число), так и имя имени для печати. Для этого стиля форматирования строк см. [Эти документы] (http://docs.python.org/2/library/stdtypes.html#string-formatting). Существует также [другие способы] (http://docs.python.org/2/library/stdtypes.html#str.format) для форматирования. –

ответ

1

Попробуйте следующее

for count, (key, values) in enumerate(sequencelist.items()): 
    with open('OTU(%d)_%s.txt' % (count+1, str(key)), 'w') as out: 
     for value in values: 
      out.write('\n'.join(value.split()) + '\n') 

я поменял порядок вашего открытого разговора с вашим значением итерации, так что вы не получаете len(sequencelist) файлов для каждого значения. Похоже, что ваш аргумент j не требовался после этого изменения. Перечисляющий вызов делает счетчик частью приращения цикла цикла каждый раз, когда цикл повторяется (его не нужно называть счетчиком).

%d запрашивает целое число, %s для строки, которая в зависимости от имени ключа будет хорошо конвертироваться с str(). Если ваш ключ - это какой-то пользовательский класс, вы захотите преобразовать его в более удобный строковый формат, поскольку вы получите примерно <class __main__.Test at 0x00000....>.

+0

Отлично, я собирался попросить объяснения и упомянуть, что вы где-то пропустили «». –

+0

Opps, исправлена ​​опечатка. Кроме того, вы могли бы сократить диапазон (len (sequencelist.keys()) 'to' range (len (sequencelist)), хотя он не изменит время выполнения, если секвенциалист действительно длинный. – Pyrce

+0

Итак, я запустил его, он работает правильно за исключением одной части.Сценарий теперь составляет 106 (полных len) копий всех 106 файлов.Как я могу сказать, чтобы сделать это только% d, а затем перейти к следующему циклу? Lol, который сгенерировал 11 000 файлов haha ​​ –

Смежные вопросы