2016-09-26 82 views
1

我已經開始學習python,並被困在有關操作文本數據的賦值上。文本行的一個例子,我需要處理:使用多個拆分選擇文本

From [email protected] Sat Jan 5 09:14:16 2008 

我需要從每一行提取小時(在這種情況下,09),然後找到最常見小時電子郵件發送的。

基本上,我需要做的是建立一個for循環,通過結腸

split(':') 

將每個文本,然後通過空間分割:

split() 

我試過好幾個小時,但似乎無法弄清楚。我的代碼看起來像至今:

name = raw_input("Enter file:") 
if len(name) < 1 : name = "mbox-short.txt" 
handle = open(name) 
counts = dict() 
lst = list() 
temp = list() 
for line in handle: 
    if not "From " in line: continue 
    words = line.split(':') 
    for word in words: 
     counts[word] = counts.get(word,0) + 1 

for key, val in counts.items(): 
    lst.append((val, key)) 
lst.sort(reverse = True) 

for val, key in lst: 
print key, val 

上面的代碼只做1分,但我一直嘗試多種方法來再次分裂的文本。我不斷收到一個列表屬性錯誤,說「列表對象沒有屬性拆分」。希望對此有所幫助。再次感謝

+0

'line.split(「:」)[0] .split(「」)[ - 1]'? – L3viathan

+0

通常,爲了開發,尤其是共享代碼,請將示例數據放入程序本身。然後其他人可以運行並修改你的代碼。在這種情況下,'handle = <行列表>'只需幾行。 FWIW,我相信@ L3viathan snippet會解決你的特殊問題。 –

+0

感謝您的幫助!然而,由於某些原因,代碼只輸出一位數字,這使數字1和0在計數中顯示很多(因爲它們是第一位數字)。我如何計算兩位數?我試圖使它'line.split(「:」)[0] .split(「」)(0:2)',但這給了一個錯誤 –

回答

1

首先,

import re 

然後更換

words = line.split(':') 
for word in words: 
    counts[word] = counts.get(word,0) + 1 

通過

line = re.search("[0-9]{2}:[0-9]{2}:[0-9]{2}", line).group(0) 
words = line.split(':') 
hour = words[0] 
counts[hour] = counts.get(hour, 0) + 1 

輸入:

From [email protected] Sat Jan 5 09:14:16 2008 
From [email protected] Sat Jan 5 12:14:16 2008 
From [email protected] Sat Jan 5 09:14:16 2008 
From [email protected] Sat Jan 5 09:14:16 2008 
From [email protected] Sat Jan 5 15:14:16 2008 
From [email protected] Sat Jan 5 12:14:16 2008 
From [email protected] Sat Jan 5 09:14:16 2008 
From [email protected] Sat Jan 5 13:14:16 2008 
From [email protected] Sat Jan 5 12:14:16 2008 

輸出:

09 4 
12 3 
15 1 
13 1 
1

使用相同的測試文件作爲馬塞爾雅克馬查多:

>>> from collections import Counter 
>>> Counter(line.split(' ')[-2].split(':')[0] for line in open('input')).items() 
[('12', 3), ('09', 4), ('15', 1), ('13', 1)] 

這表明,雖然13只發生一次09發生的4倍。

如果我們想要更漂亮的輸出,我們可以做一些格式化。這顯示了從最常見到最不常見的小時和他們的計數:

>>> print('\n'.join('{} {}'.format(hh, n) for hh,n in Counter(line.split(' ')[-2].split(':')[0] for line in open('input')).most_common())) 
09 4 
12 3 
15 1 
13 1