2012-09-01 34 views
0

我有文本文件中的數據,我需要將其存儲在數據庫中,現在我有點困惑如何更容易地做到這一點。如何用python優雅地抓取數據?

這裏是我的數據的例子:

a: text1 
b: text2 
c: text3 
blah blah not necessary text 
a: text4 
b: text5 
c: text6 
etc 

所以,你能幫我解析這個數據。 我已經做下一個代碼

import urllib2 as ur 

def getPageData(url): 
    return ur.urlopen(url).readlines() 

checkList = ['a', 'b', 'c'] 

if __name__ == '__main__': 
    textList = getPageData(url) 
    res = [] 
    for i in textList: 
     for y in checkList: 
      if y in i: 
       print i 

我在基地像

id | a varchar | b varchar | c varchar | 

創建一個表,我希望下一個結果

id | a varchar | b varchar | c varchar | 
1 | text1  | text2  | text3  | 
2 | text4  | text5  | text6  | 
n | text  | text  | text  | 

如果按行讀取文本文件行如何把這個文本分成邏輯塊,例如我得到a,b,c用這個數據創建字典,接下來當這個塊結束時,我將字典添加到列表中,之後我有列表字典來存儲它以基礎。但我有點困惑如何創建這個列表與這本詞典我需要檢查,以及如何避免不必要的數據呢?有沒有更優雅的方式來做到這一點?

+0

您是否事先知道標識符的名稱('a,b,c')? –

+0

是的,我知道它。他們沒有改變,但重複所有文字。 –

+0

如何確定「id」行的值,以及如何將「a」,「b」和「c」值分組爲一行? –

回答

3

我的:結腸和測試分裂,如果第一部分是一組允許的前綴:

checkList = set(['a', 'b', 'c']) 

for i in textList: 
    check, rest = i.split(':', 1) 
    if check.strip() not in checkList: 
     continue 
    data = rest.strip() 
    # insert data into database; check is your column name. 
+0

Thnx,Martijn。我現在試試。 –

1

如何:

text = """a: text1 
b: text2 
c: text3 
blah blah not necessary text 
a: text4 
b: text5 
c: text6 
etc.""" 

import re 
from collections import defaultdict 

d = defaultdict(list) 
for line in textList: 
    m = re.match(r"([^:]+):\s*(.*)", line) 
    if m: 
     d[m.group(1)].append(m.group(2)) 

然後你得到

>>> d 
defaultdict(<type 'list'>, {'a': ['text1', 'text4'], 'c': ['text3', 'text6'], 
'b': ['text2', 'text5']}) 

正則表達式標識包含至少一個標識符的行(例如),然後是一個冒號,並將冒號(.*)後面的標識符和文本放入匹配組中。然後它將結果放入一個「默認字典」中,在引入它時創建其內容。

如果你知道標識符事先,你可以使用

m = re.match(r"(a|b|c|otherid|diff_id|etc)\s*:\s*(.*)", line) 

代替。

+0

Thnx Tim爲此解決方案。我現在也試一試。是一個集合默認模塊? –

+0

@IshikawaYoshi:是的,它在標準庫中。 –

+0

好的,我需要時間來測試它) –