2016-11-20 8 views
0

У меня вопрос о домашнем задании. Я должен написать функцию «WordsByLine», которая должна подсчитывать частоту уникальных слов в строке в файле и печатать частоту уникальных слов в соответствующей строке в выходном файле. Мой профессор рассказал нам, как должен выглядеть выход. Например, если входной текстовый файл говорит:Как получить счетчик для печати частоты уникальных слов из каждой строки входного текстового файла в соответствующую строку в выходном текстовом файле?

one fish two fish red fish blue fish

(одна рыба две рыбы является первой линии красной рыбы голубой рыбы является второй линии.).

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

two:1 one:1 fish:2 red:1 blue:1 fish:2

Первая строка в выводе является частота уникальных слов для первой линии, а затем то же самое для второй линии.

Вот мой код:

def wordsByLine(inFile, outFile): 
    from collections import Counter 
    outFile = open(outFile, 'w') 
    with open(inFile, 'r') as f: 
     freqs = Counter(f.readline().split()) 
    outFile.write(str(freqs)) 
    outFile.close() 
print(wordsByLine('input.txt','output.txt')) 

Но вот мой выход в текстовом файле. Она выводит только первую строку .:

Counter({'two':1, 'one':1, 'fish':2})

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

+0

Не импортировать внутри функции. Это почти никогда не бывает хорошей идеей. –

+1

Две заметки: 1) ваше задание состояло в том, чтобы написать функцию, которая подсчитывает слова * на строку *: ваша функция должна работать только на одной строке и печатать частоту. 2) вы не просматриваете все строки файла, но вы просто читаете одну строку. – sal

+0

Каждый раз, когда вы открываете (outFile, 'w') ', он создает новый файл. Вы хотите 'open (outFile, 'wa')' добавлять в любой существующий файл. Было бы лучше просто открыть файл один раз и записать каждую последующую выходную строку. – martineau

ответ

0

Как указано в комментариях, вы читали только одну строку с f.readline. Кроме того, вы, вероятно, хотите, чтобы форматировать текст вместо распечатки строковое представление Counter объекта:

>>> from collections import Counter 
>>> def words_by_line(infile, outfile): 
...  with open(infile) as f1, open(outfile, 'w') as f2: 
...   for line in f1: 
...    counts = Counter(line.split()) 
...    string_gen = ("{}:{}".format(k,v) for k,v in counts.items()) 
...    f2.write(" ".join(string_gen) + "\n") 
... 
>>> words_by_line('input.txt','output.txt') 

Результат:

(trusty)[email protected]:~$ cat output.txt 
fish:2 two:1 one:1 
fish:2 red:1 blue:1 
(trusty)[email protected]:~$ 
+0

Спасибо, что это был правильный ответ, и, кстати, (trusty) juan @ localhost: ~ $ cat output.txt не вышел. То же самое с (надежным) juan @ localhost: ~ $. Хорошо, что эти два парня не вышли. Но теперь я в порядке! – Jorgan