2016-01-06 45 views
0
abc 
123 
234 
567 
acb 
d23 
678 
c34 
aad 
443 
c66 
78d 

我需要編寫一個循環開始讀取文件。只要它看到一行開始與「一」,它會經過下面的所有行「A」,直到找到另一條線從「a」,將創建一個字典象下面這樣:搜索一個文件,直到找到一些匹配,然後再繼續搜索直到行尾

{ "abc": [123,234,567], "acb": [d23,678,c34], "aad": [443,c66,78d] }

我對Python非常陌生,我正在創建一個腳本,其中有類似的挑戰。

+1

讓我們看看你的代碼 – Arman

+0

我可以給你的誠實答案:你的問題太寬泛,無法直接回答,無需爲你編寫整個程序。由於我們不是免費的代碼編寫服務,我們不會那樣做。 在python中這樣做並不是很難,但是你至少需要能夠編寫python。轉到python.org,按照基本教程。 –

+0

嗨馬庫斯,謝謝,可能它看起來像一個家庭作業,但它不是,我是一個系統管理員,並希望在python中實現一些腳本,我問的問題只是一個問題的開始,我還有很長的路要走,但如果我能得到一些開始的幫助,那麼我應該能夠弄清楚我的自我。 – alammd

回答

0

我想我理解正確的話您的問題,請糾正我,如果我誤解你了 假設你的數據在文件命名爲t.txt

import re 
f = open("t.txt") 
text = f.read() 

answer_dict = {} 
value_list = [] 
key = "" 
for line in text.split("\n"): 
    print line 
    if re.search('^a', line) != None: 
     value_list = [] 
     key = "" 
     key = line 
    else: 
     value_list.append(line) 
     answer_dict[key] = value_list 

print answer_dict 

{'acb': ['d23', '678', 'c34'], 'abc ': ['123', '234', '567'], 'aad': ['443', 'c66', '78d']} 
+0

嗨Prashant, 非常感謝你的代碼,我已經差不多完成了我的腳本,我將在這裏分享最後的腳本,但是如果我想通過提供價值來找到密鑰,你可以幫我提出一個請求, ,我怎麼做 ? 例如,如果想通過提供價值234,我將如何得到鑰匙「ABC」 – alammd

+0

基本上這,我期待的結果「ABC」的值「123」 '爲K,V在answer_dict搜索字典。 iteritems(): 打印K,v 如果str(v)== 「123」: 打印 「他們關鍵的是:」 打印ķ 其他: 打印 「無鑰匙上發現」' 出來放: - acb ['d23','678','c34'] 找不到密鑰 abc ['123','234','567'] 找不到密鑰 aad ['443', 'c66','78d',''] 未找到密鑰 – alammd

+0

嘗試此標誌= 1 for k,v in answer_dict。iteritems():打印K,V如果str(V)==「123」:打印「鍵,他們是:」打印ķ標誌= 0,如果標誌:打印「無鑰匙上發現」 –

0

您可以使用itertools.groupby使用拆分成團

from itertools import groupby 
with open("in.txt") as f: 
    # use itertools.imap for python2 
    grps = groupby(map(str.rstrip,f), key=lambda x: x[0] == "a") 
    d = {} 
    for k,v in grps: 
     if k: 
      k = next(v) 
      d[k] = list(next(grps,["", ""])[1]) 
print(d) 

輸出::

"a"開始作爲分隔符線
{'acb': ['d23', '678', 'c34'], 'aad': ['443', 'c66', '78d'], 'abc': ['123', '234', '567']} 

或使用,當你發現開始a行定期循環開始內部循環:

with open("in.txt") as f: 
    d,f,k = {}, map(str.rstrip, f),None 
    for line in f: 
     if line.startswith("a"): 
      k = line 
      d[k] = [] 
      for line in f: 
       if line.startswith("a"): 
        k = line 
        d[k] = [] 
        break 
       d[k].append(line) 
     elif k: 
      d[k].append(line) 

將輸出相同。我認爲應該始終在a開始的任何行後面都有一個段落,但如果不是list(next(grps,["", ""])[1]),則會將該值設置爲沒有空白的列表。

+0

帕德里克·你好,感謝雙方的技術,你能告訴我,地圖什麼用途?我看到它的用途相當多 – alammd

+0

@FAlam,它映射跨越任何可迭代傳遞到它的功能,在這種情況下,我們rstrip了所有的換行,你叫'line.rstrip()'每行圈在礦井位圖實際上更快 –

相關問題