2010-06-24 2 views
0

У меня есть простая функция, которая сортирует словарь:написать отсортированные результаты в файл

data = inputfile.readlines() 
lineData = sorted(data, key=len, reverse=True)[:3] 

Печать вывод:

print sorted(data, key=len, reverse=True)[:3] 

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

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

ничего не генерирует. Как написать вывод в текстовый файл (выходной файл)? Полный код выглядит следующим образом:

import sys, string 
inputfilenames, outputfilename = sys.argv[1:-1], sys.argv[-1] 


def do_something_with_input(inputfile): 
    data = inputfile.readlines() 
    print sorted(data, key=len, reverse=True)[:3] 
    print sys.path[0]+"/"+ outputfilename 


def write_results(outputfile): 
    data = inputfile.readlines() 
    outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

for inputfilename in inputfilenames: 
    inputfile = open(inputfilename, "r") 
    do_something_with_input(inputfile) 
    outputfile = open(outputfilename, "w") 
    write_results(outputfile) 

ответ

1

writelines является метод, вы должны назвать его:

outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

ETA
Функция open обеспечивает дескриптор файла, который может быть итерированным над раз. Вы делаете это в своей функции do_something_with_input, после повторения итерации inputfile, итератор исчерпан. Это означает, что любые дальнейшие итерации, например, выполненные в ваших функциях write_results, могут привести к пустой последовательности. Вот почему в выходной файл ничего не записывается. В основном, это эквивалентно:

>>> a = (i for i in range(2)) 
>>> list(a) 
[0, 1] 
>>> list(a) 
[] 

Что вам нужно сделать, это сохранить выход sorted(...), а затем записать его в файл, а не пытаться создать его снова.

+0

Спасибо. Изменение функции write_results было именно тем, что мне нужно было сделать. – kjarsenal

0

Вы пишете:

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

не создает ничего.

он должен фактически генерировать исключение синтаксиса ошибки из-за недостающие скобки - если это не так, я думаю, вы должны использовать некоторые (предположительно) «умные» IDE как IPython, который ставит в скобках на ваше имя - это дело?

Вы печатаете три кратчайшие строки, и все они могут быть пустыми - это должно помещать три пустых строки в ваш выходной файл (и, конечно же, ничего не показывать в stdout - это то, что вы подразумеваете под «генерирует» ничего"?). Возможно, вы неправильно вызываете outputfile.close(), поэтому к тому моменту, когда вы проверите файл, они все еще буферизуются и не записываются на диск.

Как вы видите, существует огромное количество возможностей вокруг вашего очень двусмысленного утверждения «ничего не генерирует». Можете ли вы уточнить точно какую среду вы используете и как конкретно вы проверяете, что ваш код «генерирует» или нет? В противном случае вам очень сложно помочь.

Edit: ОП выяснены и показал свой код - и проблема сейчас ясно: он полностью потребляя inputfile в первый раз, никогда «перематывать», поэтому файл сразу же заканчивается (никаких линий не осталось в нем) на втором звонке readlines.Если вам нужно прочитать файл дважды независимо (вместо того, чтобы просто читать его один раз и передавать данные, как это было бы нормально), вам понадобится вызов inputfile.seek(0) для «перемотки файла» каждый раз, когда вы его читаете, чтобы сделать это готовый к чтению снова и снова.

+0

Извините. То, что я должен был сказать, генерирует пустой текстовый файл. Запись была отредактирована для обеспечения полного кода. Я использую IDLE. – kjarsenal

+0

Кроме того, он должен вызывать три длинные строки. Печатный выход делает это. – kjarsenal

+0

@kjarsenal, теперь, когда вы показываете свой код, проблема стала ясна, см. Редактирование моего ответа. –

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