如何用python优雅地获取数据?

时间:2012-09-01 09:56:27

标签: 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用这个数据创建字典,然后当这个块结束时我将字典附加到列表中,然后我有dict列表将它存储到base。但我有点困惑如何使用这个字典创建这个列表我需要检查什么以及如何避免不必要的数据呢?是否有更优雅的方式来做到这一点?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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']})

正则表达式标识包含至少一个标识符(例如a),然后是一个冒号的行,并将冒号(.*)后面的标识符和文本放入匹配项中组。然后,它将结果放入“默认字典”中,在创建内容时创建其内容。

如果您事先知道标识符,则可以使用

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

代替。