2013-06-22 6 views
-1

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

d[class name]=(list of files) 

например:

d[earn]=(6,7,4) 

где 6.txt, 7.txt и 4.txt являются файлы, относящиеся к классу «заработать»

Теперь мне нужно создать еще один словарь d2, что:

d2[earn]=(12,3,2,17) 

где

  • 12 является число раз слово «зарабатывающих» происходит в 6.txt,
  • 3 является число раз слово «зарабатывающих» происходит в 7.txt,
  • 4 - количество раз, когда слово «заработать» происходит в 4.txt
  • 17 - это количество раз, когда слово «заработать» происходит во всех трех файлах, т.е. сумма.

Вот мой код:

import collections 
import sys 
import os 
import re 
sys.stdout=open('dictionary.txt','w') 
from collections import Counter 
from glob import glob 


folderpath='d:/individual-articles' 
counter=Counter() 

with open('topics.txt') as f: 
    d= collections.defaultdict(list) 
    for line in f: 
     value, *keys = line.strip().split('~') 
     for key in filter(None, keys): 
      d[key].append(value+".txt") 

filepaths = glob(os.path.join(folderpath,'*.txt')) 

def words_generator(fileobj): 
    for line in fileobj: 
     for word in line.split(): 
      yield word 
word_count_dict = {} 
for file in filepaths: 
    f = open(file,"r") 
    words = words_generator(f) 
    for word in words: 
     if word not in word_count_dict: 
       word_count_dict[word] = {"total":0} 
     if file not in word_count_dict[word]: 
       word_count_dict[word][file] = 0 
     word_count_dict[word][file] += 1    
     word_count_dict[word]["total"] += 1   
for k in word_count_dict.keys(): 
    for filename in word_count_dict[k]: 
     if filename == 'total': continue 
     counter.update(filename) 

for word, counts in word_count_dict.items(): 
    print(word, counts['total']) 

Мне нужно напечатать d2, но мой код не работает.

ответ

0

Я думаю, что это должен делать то, что вы ищете:

from collections import defaultdict 
d2 = defaultdict(list) 
for word,files in d.items(): 
    for fname in files: #go over each file name in the 'list' which was associated with the key 'word' in d 
     with open(fname) as f: 
      d2[word].append(f.read().count(word)) #add the count of the word in the file 
      #d2[word].append(f.read().split().count(word)) use this if you want words not occurances of 'word' in the file 
    d2[word].append(sum(d2[word])) #add the sum of all the counts 
print d2 
+0

Заметим, что 'f.read (COUNT) (слово)' может иметь неожиданные результаты, как:. ' "Foobar" .Count (» foo ') -> 1', предпочитаем 'regex'. –

+0

@AshwiniChaudhary Да, я понял, что после публикации добавлен 'f.read(). Split(). Count (word)' под ним. Использование регулярного выражения может быть лучше, OP может это понять. – HennyH

+0

я получаю эту EROR: Файл "C: \ Python33 \ access_dict.py", строка 36, в с открытым (имя_файла), а е: FileNotFoundError: [Errno 2] Нет такого файла или каталога: '16951' – radhika