2016-03-29 3 views
0
man 
    cat 
    dog 
apple 
    sun 
    friend 

У меня есть текстовый файл в таком формате я должен сделать питон словарю: { «человека»: «кошки, собака», яблоко: «солнце», «друг»} слова человек и apple не имеют пробелов, все остальные имеют 2 пробела, поэтому эти два должны быть ключами, а слова под ними должны быть значениями.Сделать питон словарь из текстового файла

input_file = "/home/yan/lem.txt"

class myDict(dict): 

    def __init__(self): 
     self = dict() 

    def add(self, key, value): 
     self[key] = value 

lema = myDict() 

with open(input_file, encoding='utf8', errors='ignore') as f: 
    for line in f: 
     if not line.startswith(" "): 
      lema.add(line.split(), [i for i in f if i.startswith(" ")]) 
print(lema) 

пытался выше кода, но это дает не то, что я ожидал.

+2

Добро пожаловать в SO. Пожалуйста, отформатируйте код в своем сообщении. Код тела должен быть отформатирован с четырьмя пробелами, а встроенный код должен быть отформатирован с обратными окнами. –

+0

- это любая другая строка? –

+0

Нет, они не пустые – Yan

ответ

1
  1. вы не можете использовать self в качестве словаря имени, в питоне используются для обозначения вашего переменного экземпляра, хотя это не зарезервировано ключевым слова.

  2. функция класса add(), попробуйте использовать dict.setdefault (key, list()). Append (value) сохраняет новые значения для существующего ключа.

  3. метод коррекции __str__ которые отображают ожидаемое формат строки при вызове print(lema)

$ кошка test.py

input_file = "lem.txt" 
    class myDict(dict): 

     def __init__(self): 
      self.mydict = dict() 

     def add(self, key, value): 
      self.mydict.setdefault(key, list()).append(value) 

     def __str__(self): 
      tmp = list() 
      for key, value in self.mydict.items(): 
       tmp.append("{0}:{1}".format(key, value)) 
      return "\n".join(tmp) 

    lema = myDict() 

    with open(input_file) as f: 
     for line in f: 
      if not line.strip(): 
       '''skips blank line''' 
       continue 
      elif not line.startswith(" "): 
       key = line.strip() 
      elif line.startswith(" "): 
       value = line.strip() 
       lema.add(key,value) 

    print(lema) 

The output is: 

    $python test.py 
    apple:['sun', 'friend'] 
    man:['cat', 'dog'] 
+0

человек apple sun friend Это прекрасно работает ! Но как насчет случаев, когда у меня нет слов после слов без пробелов раньше? – Yan

1

это поможет вам, что вам нужно:

d = {} 
k = '' 
with open('lem.txt') as f: 
    for ln in f.readlines(): 
     if ln.startswith(' '): 
      d.setdefault(k, []).append(ln.strip()) 
     else: 
      k = ln.strip() 

print d 
1

Вы можете чавкать файл в одну большую строку, s, и затем выполните примерно следующее:

s = """man 
    cat 
    dog 
apple 
    sun 
    friend""" 

d = {} 

for line in s.replace("\n ",',').split('\n'): 
    words = line.split(',') 
    d[words[0]] = words[1:] 

>>> d 
{'man': ['cat', 'dog'], 'apple': ['sun', 'friend']} 

Чтобы получить представление о том, что здесь происходит:

>>> s.replace("\n ",',') 
'man,cat,dog\napple,sun,friend' 
Смежные вопросы