Python назначить функцию для ввода значения - PullRequest
1 голос
/ 22 декабря 2010

Я пытаюсь написать скрипт, который открывает файлы на основе значений словаря.Для каждого ключа / значения он открывает файл на основе имени этого значения и присваивает этот файл имени значения (я думаю, что здесь все идет не так).Пока он открывает файлы для меня, с правильными именами, так что работает.Тем не менее, я думаю, что имя, которому я назначаю функцию open (file), неверно, так как остальная часть моей функции больше не открывает файлы, и я не могу их закрыть.Пример моего сценария:

filelist=[]
codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for value in codeconv.values():
    value=open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
    filelist.append(value)

"Here I do something with the files"

for f in filelist:
    f.close()

Итак, проблема в том, как назначить функции open (file) правильное имя?(Вот, например, r1p1d и r2p1d) И как мне потом снова вызвать их?

Я получаю сейчас ошибку: AttributeError: 'str'object не имеет атрибута' close 'в строке f.close ().

РЕДАКТИРОВАТЬ: теперь он работает так, как я хочу, используя следующий код: (я также включил часть «здесь я делаю что-то» сейчас просто для ясности)

result=open("C:\\Biochemistry\\Pythonscripts\\Illuminaresults.txt", "r")
filelist=[]

codeconv={"agt":"r1p1d", "aga":"r2p1d"}        
opened_files={}
for key, value in codeconv.items():
    filename="c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt"
    file=open(filename, 'w')
    opened_files.update({key: file})

for line in result:
    if line[0]==">":
        lastline=line
    if line[0:3] in codeconv and len(line)==64:
        f=opened_files[line[0:3]]
        f.write(lastline+line)
    else: continue 

for f in opened_files.values():
    f.close()

result.close()

IОднако теперь возникает другая проблема, когда я пытаюсь написать следующую часть моего скрипта, но это, вероятно, что-то для другого вопроса, так как он дает Windowserror, не относящийся к этой части.Спасибо всем за помощь!

Ответы [ 6 ]

0 голосов
/ 22 декабря 2010

Файлы уже открыты - ваш объект filelist содержит объекты открытых файлов, которые вы можете перебирать (например, с помощью for line_of_text in filelist[0]:) или вызывать другие функции (см. dir(file) для других членов).

Вы можете отложить открытие файла, назначив лямбду и вызвав его позже, например:

for value in codeconv.values():
    value2 = lambda: open(complete_filename)
    filelist.append(value2)

my_file_object = filelist[0]()

Вы можете предпочесть хранить их в словаре:

for value in codeconv.itervalues():
    filedict[value] = lambda: open(complete_filename)

my_file_object = filedict["r1p1d"]()

Или, если вы действительно хотите создать новые переменные (я настоятельно рекомендую не делать это, но так как вы спросили):

for value in codeconv.itervalues():
    globals()[value] = open(complete_filename)
    # or
    #globals()[value] = lambda: open(complete_filename)
    # if you prefer

Наконец, вы закрываете файлы как есть (вместо filelist вместо *1020* подставляется словарь).


(Очевидно, вам нужно заменить complete_filename в вышеприведенных примерах на то, как вы вычисляете фактическое имя файла. Мне не нужно было это говорить, но я слишком часто ужалил, пропуская подобные подробности.)

0 голосов
/ 22 декабря 2010

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

Я предложусделайте это, используя другой словарь, подобный этому:

codeconv={"agt":"r1p1d", "aga":"r2p1d"}
opened_files = {}

for key, value in codeconv.items():
    file_name = "c:\Biochemistry\Pythonscripts\Splittest\split%s.txt" % value
    file=open(file_name, 'w')
    opened_files.update({key: file})

, теперь вы можете получить доступ к открытым файлам из словаря, как это:

f = opened_files['agt'] 
f.read()
....

, и для вас последний код сделает это так:1009 *

for f in opened_files.values():
    f.close()
0 голосов
/ 22 декабря 2010

Возможно, вы хотите добавить кортежи к filelist, чтобы имя ассоциировалось с файловым объектом

codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for value in codeconv.values():
    f=open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
    filelist.append((value, f))

"Here I do something with the files"

for name, f in filelist:
    f.close()
0 голосов
/ 22 декабря 2010

Вы не назначаете функцию, вы назначаете возвращаемое значение.Который, по-видимому, в данном случае является строкой, а не файловым объектом, что немного удивляет.Вы что-нибудь делаете со списком файлов в части «здесь я делаю что-то»?

[edit] хорошо, звучит так, как будто вы хотите, чтобы между ключом / fileobject (с использованием примера) использовался контроль.

codeconv={"agt":"r1p1d", "aga":"r2p1d"}
filedict = {key, open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
            for key, value in codeconv.iteritems()}

#Here I do something with the files
filedict["agt"].write("foo")
filedict["aga"].write("bar")

for f in filedict.values():
    f.close()
0 голосов
/ 22 декабря 2010

Я не вижу проблемы в вашем коде, может быть, это не в вставленной части? (в filelist, или отбитый бит).

Но в любом случае, я бы переписал его, чтобы не использовать одну и ту же переменную value для двух разных вещей:

filelist = []
codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for file_id in codeconv.values():
    f = open("c:\Biochemistry\Pythonscripts\Splittest\split"+file_id+".txt", 'w')
    filelist.append(f)

"Here I do something with the files"

for f in filelist:
    if isinstance(f, str):
        print "WARNING: Expected file handle, got string:", f
    else:
        f.close()

(я также добавил немного кода для устранения неполадок)

0 голосов
/ 22 декабря 2010

Я бы предостерег от повторного использования «значения» в этом первом цикле, для ясности и будущих ошибок, которые могли бы там появиться.

Но код, который вы разместили, на самом деле работает, поэтому очевидно, что происходит что-то еще, что мы не можем диагностировать здесь.Что вам нужно сделать, это проверить содержимое filelist, прежде чем пытаться закрыть дескрипторы файла в нем.Это, вероятно, укажет вам на ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...