0

我在文本文件中有数据,我需要将其存储在数据库中,现在我有点困惑如何更容易地做到这一点。

这是我的数据示例:

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

我在 base 中创建了一个表,例如

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 将其存储到基础。但是我有点困惑如何用这本字典创建这个列表我需要检查什么以及如何避免其中不必要的数据?有没有更优雅的方法来做到这一点?

4

2 回答 2

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.
于 2012-09-01T10:00:02.343 回答
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)

反而。

于 2012-09-01T10:05:40.530 回答