2017-06-25 93 views
1

我有一個包含餐館信息的文本文件,要求將此信息插入多個詞典。屬性是名稱,評級,價格範圍,美食類型閱讀文件並將內容插入到詞典

這裏的TXT

Georgie Porgie 
87% 
$$$ 
Canadian,Pub Food 

Queen St. Cafe 
82% 
$ 
Malaysian,Thai 

的內容到目前爲止,我已經讀文件,抓住內容的列表。

content = []; 
with open(file) as f: 
     content = f.readlines(); 
     content = [x.strip() for x in content]; 

需要插入到三個字典 names_rating,price_names,cuisine_names我會怎麼做呢?

+0

您將不得不提供更多信息。具體來說,有人需要知道字典的結構,以便對問題給出完整的答案。 –

+1

您的輸入是否與您在示例中給出的輸入完全相同,還是以逗號分隔?在前一種情況下,您的主要問題是找到每行的分割位置,以便在每個字典中獲取正確的數據。 – JohanL

+0

爲什麼不嘗試,直到你得到一個錯誤,無法弄清楚? –

回答

2

一般情況下,從列表list_of_lists,你在哪裏指數j映射項目索引i到該項目的列表構造字典lists_of_dicts的列表,你可以使用的字典比較像這樣:

list_of_dicts = {lst[i]: lst[j] for lst in list_of_lists} 

您應該可以將其應用於任意list_of_lists以解決您的問題。

+0

'i'&'j'聲明在哪裏? – EarthDragon

+0

他們在設置中給出,就像'list_of_lists' –

2

看到你給出的文件的例子,元素是空格分開的。

所以,你的任務是:

  • 打開文件
  • 閱讀每一行
  • 拆分對空間的條目
  • 保存在詞典中的詞條

這將如下完成:

names_rating = {} 
price_names = {} 
cuisine_names = {} 
with open(file) as f: 
    lines = [] 
    for line in f: 
     content = f.readline().rstrip() 
     if content != '' 
      lines.append(content) 
     if len(lines) > 4 : 
      name = lines[0] 
      rating = lines[1] 
      price = lines[2] 
      cuisine = lines[3].split(',') 
      names_rating[name] = rating 
      price_names[name] = price 
      cuisine_name[name] = cuisine 
      lines = [] 

在此,文件逐行讀取,結果附加在列表lines中。當列表大小超過4時,所有屬性都會被讀入列表中。然後處理它們以將數據保存在字典中。然後清單再次完成該過程。

+0

我所有的文件內容都在內容數組中。 –

+0

@KumaranathFernando從文件中讀取的每一行都保存爲「string」變量而不是「list」。所以'content'變量不能是'list'。這是一個「字符串」。同樣,新的行符「\ n」也被讀入變量中。 'rstrip()'函數可以用於'string's去除不必要的尾隨字符。根據這個我在代碼中進行了更正。 – gaurav

+0

我的錯我對文本內容犯了錯誤。每個屬性不打算以空格分隔,但用新行 –

2

鑑於文本文件的最新格式規範:

Georgie Porgie 
87% 
$$$ 
Canadian,Pub Food 

Queen St. Cafe 
82% 
$ 
Malaysian,Thai 

,如果你可以假設:

  • 每家餐廳的條目將永遠四條線來定義,你是含有領域之後(閱讀:字典條目)
  • 該字段將始終顯示爲相同的確切順序
  • 每個條目將始終由下一個通過空線E

,那麼你可以使用modulo operation去這樣的事情:

import re 

content = {} 
filepath = 'restaurants_new.txt' 
with open(filepath, 'r') as f: 
    fields = ['name', 'rating', 'price', 'cuisine'] 
    name = '' 
    for i, line in enumerate(f): 
     modulo = i % 5 
     raw = line.strip() 
     if modulo == 0: 
      name = raw 
      content[name] = {} 
     elif modulo < 4: 
      content[name][fields[modulo]] = raw 
     elif modulo == 4: 
      # we gathered all the required info; reset 
      name = '' 

from pprint import pformat 
print pformat(content) 

編輯: 下列溶液格式化您發佈最初,它看起來像這樣後提議:

Georgie Porgie 87% $$$ Canadian,Pub Food 
Queen St. Cafe 82% $ Malaysian,Thai 

我在這裏留下原始答案,以防萬一它仍然對其他人有用。

作爲JohanL mentioned in his comment,問題解決方案的最小平均值是行格式:取決於您是否使用逗號或空格作爲分隔符或兩者的組合,並且考慮到餐館的名稱可以包含未知數單詞,找到如何分割你的行可能會變得棘手。

下面是來自一個由@gaurav提出了稍有不同的方法,使用regular expressionsre模塊):

import re 

content = {} 
filepath = 'restaurants.txt' 
dictmatch = r'([\s\S]+) ([0-9]{1,3}\%) (\$+) ([\s\S]+)' 
with open(filepath, 'r') as f: 
    for line in f: 
     raw = line.strip() 
     match = re.match(dictmatch, raw) 
     if not match: 
      print 'no match found; line skipped: "%s"' % (raw,) 
      continue 
     name = match.group(1) 
     if name in content: 
      print 'duplicate entry found; line skipped: "%s"' % (raw,) 
      continue 
     content[name] = { 
      "rating": match.group(2), 
      "price": match.group(3), 
      "cuisine": match.group(4) 
     } 

from pprint import pformat 
print pformat(content) 

此方法的優點,假設你對源TXT沒有控制,是你可以調整正則表達式來匹配它隨之而來的任何「不理想」的格式。

相關問題