2015-06-16 2 views
0

У меня есть словарь в функции, которая называется searchInMyDict (dict), например. Словарь, включенный в эту функцию, имеет для ключа имя группы и имеет для значения список функций гена.Python3 создавать файлы из словаря

словарь выглядит следующим образом:

{"OG_1": ["gene's functionA, gene's functionB, gene's functionC"] 
"OG_2": ["gene's functionM, gene's functionL, gene's functionX"] 
"OG_XX": ["gene's functionY, gene's functionP, gene's functionR"]} 

Так «OG_1», например, является одним из ключей моего Dict, и «functionA гена, functionB гену, functionC гену» является значением этого ключа.

Мне нужно создать функцию, которая способна: создать файл .txt с именем группы в качестве имени файла и который будет содержать все функции гена для этой группы и создать такой файл для каждой группы в мой дикт.

пример: file1name является «OG_1.txt» и содержит «функцию гена A, функцию гена B, функцию гена C». file2name - «OG_2.txt» и содержит «функцию гена M, функцию гена L., функцию гена X». И так далее и так далее до последней группы, которая создаст «OG_XX.txt» в качестве имени файла и с «функцией гена г, функцией гена г, функцией гена X» в нем. Поэтому я ожидаю получить много файлов, по одному для каждой группы.

Я пытался что-то вроде этого:

def writeFilesForEveryGroupsFromDict(aDict): 
for key in aDict: 
    if not len(key) != len(aDict): 
     f = open("key", "w") 
     f.append(aDict[key]) 
    else: 
     break 

finalDict = searchInMyDict(dict) 
print(writeFilesForEveryGroupsFromDico(finalDict)) 

но это, кажется, не работает вообще, я, наверное, забыл несколько вещей. Есть ли кто-нибудь с идеей решить мою проблему? Спасибо за ваши ответы!

+0

Можете ли вы объяснить, что не работает точно? –

+0

, когда я держу «if not ...» до тех пор, пока «break» он не отправит: None. если я удалю из «if», чтобы «сломать», он говорит: AttributeError: объект '_io.TextIOWrapper' не имеет атрибута 'append' –

ответ

1
  1. if not len(key) != len(aDict) Снимите и break.

    Что вы, вероятно, хотели сделать, это остановить цикл после итерации всех ключей. Однако key является одним из 'OG_1', 'OG_2', 'OG_XX', это не счетчик или что-то в этом роде.

  2. Заменить open("key", "w") на open(key + ".txt", "w").

    open("key", "w") означает «открыть файл с именем key для записи».Но то, что вы хотите сделать, - «открыть файл с именем <the key of the dictionary>.txt». Это означает, что вам нужно значение ключа и суффикса .txt.

  3. Заменить f.append на f.write.

    Так вы записываете строки в файлы.

  4. Использовать aDict[key][0] вместо aDict[key].

    Значения вашего словаря - это списки, содержащие одну строку, поэтому вы должны извлечь только эту строку из значения.

В конце концов, вот результат:

def writeFilesForEveryGroupsFromDict(aDict): 
    for key in aDict: 
     f = open(key + '.txt', 'w') 
     f.write(aDict[key][0]) 

Это должно работать. Обратите внимание, что есть еще возможности для улучшения.

Например, вы можете перебирать и ключи и значения одновременно (с помощью aDict.values()), и вы можете обрабатывать файл, используя with оператор (который будет заботиться о закрытии файла, если происходит исключение):

def writeFilesForEveryGroupsFromDict(aDict): 
    for key, value in aDict.values(): 
     with open(key + '.txt', 'w') as f: 
      f.write(value[0]) 
+0

Привет, мне просто нужно было изменить строку: f.write (aDict [key]) to f.write (str (aDict [key])), но кроме этой мелочи он работает правильно , Большое вам спасибо, что вы мой спаситель, я люблю тебя: D У меня отличный день –

+0

@ Arnaud'KaRn1zC ': извините, я думал, что ваши ценности были струнами. Я исправил свой пост. –

+0

Как я могу сделать то же самое, но вместо того, чтобы создавать .txt-файл, а затем создавать CSV-файл, и в этом файле я хотел бы разделить элементы после «]» и затем просить написать каждый элемент после разделения на новая линия? –

0

Есть несколько проблем с форматированием вашего Словаря. Я исправил их и изменил формат, основанный на описании, которое вы указали в словаре, который вы собираетесь использовать. Новый словарь представляет ключевое имя в список значений, ваша старая версия была ключомName для группы строк без разделителей.

Поскольку вы не работаете с плоскими данными, я бы рекомендовал вам хранить данные в JSON - это будет поддерживать структуру словаря и сделать его легко читаемым. Этот код сохранит новый файл * .json в том же каталоге, что и ваш код, который вы можете открыть и просмотреть в обычном текстовом редакторе. Этот же файл можно импортировать и использовать в другом скрипте python, если вы захотите использовать тот же модуль import json.

import json 

geneFunctionDict = { 
    "OG_1": ["gene's functionA", "gene's functionB", "gene's functionC"], 
    "OG_2": ["gene's functionM", "gene's functionL", "gene's functionX"], 
    "OG_XX": ["gene's functionY", "gene's functionP", "gene's functionR"] } 


def writeFilesForEveryGroupsFromDict(aDict): 
    filename = 'geneFunctionDict.json' 
    with open(filename, 'w') as outfile: 
     json.dump(aDict, outfile) 

writeFilesForEveryGroupsFromDict(geneFunctionDict) 

«» «В ответ на ваши комментарии» «»

Следующий код будет делать именно то, что вы описали в комментариях. Если вы не используете более 10 000 ключей geneFunction, я бы по-прежнему рекомендовал JSON в качестве более гибкого формата хранения данных, чем преобразование данных в словаре в плоский строковый файл.

geneFunctionDict = { 
    "OG_1": "gene's functionA, gene's functionB, gene's functionC", 
    "OG_2": "gene's functionM, gene's functionL, gene's functionX", 
    "OG_XX": "gene's functionY, gene's functionP, gene's functionR" } 

def writeFilesForEveryGroupsFromDict(filename, geneFunctionString): 
    geneFunctionFile = open(filename, 'w') 
    geneFunctionFile.write(geneFunctionString) 

for key in geneFunctionDict.keys() : 
    writeFilesForEveryGroupsFromDict(key, geneFunctionDict[key]) 
+0

Спасибо за ваш ответ, я сейчас попробую это. Для структуры dict я просто забыл функцию [] для функции гена, потому что это список, я просто забыл написать его, поскольку я работаю на python только с 3-х недель. –

+0

О, я только что заметил, с этим методом у меня только 1 файл. Я сказал, что мне нужно иметь 1 файл для каждой группы (имя ключа как имя файла), а вещи, записанные в каждом файле, - это список функций гена, который относится к имени группы. –

+0

Я приложил свой ответ, чтобы отразить ваши потребности. – Nanook