鑑於文本文件的最新格式規範:
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 expressions(re
模塊):
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沒有控制,是你可以調整正則表達式來匹配它隨之而來的任何「不理想」的格式。
您將不得不提供更多信息。具體來說,有人需要知道字典的結構,以便對問題給出完整的答案。 –
您的輸入是否與您在示例中給出的輸入完全相同,還是以逗號分隔?在前一種情況下,您的主要問題是找到每行的分割位置,以便在每個字典中獲取正確的數據。 – JohanL
爲什麼不嘗試,直到你得到一個錯誤,無法弄清楚? –