将.txt文件作为dict加载,但不包括已注释的行

时间:2014-07-08 23:07:11

标签: python dictionary

我在txt文件中有一些数据,我想把它加载到一个dicts列表中。我通常会使用csv.ReadDict(open('file')),但是这些数据在第一行中没有键值。相反,它在数据实际开始之前已经注释掉了许多行。此外,有时,注释行不会始终位于文件的开头,但可能位于文件的末尾。

但是,所有行应始终具有相同的字段,我想我可以对这些字段名称(或键值)进行硬编码,因为它们不应该更改。

示例日期

# twitter data
# retrieved at: 07.08.2014
# total number of records: 5
# exported by: userXYZ
# fields: date, time, username, source
10.12.2013; 02:00; tweeterA; web
10.12.2013; 02:01; tweeterB; iPhone
10.13.2013; 02:04; tweeterC; android
10.13.2013; 02:08; tweeterC; web
10.13.2013; 02:10; tweeterD; iPhone

以下是我迄今为止能够弄清楚的内容,但我需要一些帮助才能解决问题。

我的代码

header = ['date', 'time', 'username', 'source']
data = []

for line in open('data.txt'):
    if not line.startswith('#'):
        data.append(line)

所需格式

[{'date':'10.12.2013', 'time':'02:00', 'username':'tweeterA', 'source':,'web'},
 {'date':'10.12.2013', 'time':'02:01', 'username':'tweeterB', 'source':,'iPhone'},
 {'date':'10.12.2013', 'time':'02:04', 'username':'tweeterC', 'source':,'android'},
 {'date':'10.12.2013', 'time':'02:08', 'username':'tweeterC', 'source':,'web'},
 {'date':'10.12.2013', 'time':'02:10', 'username':'tweeterD', 'source':,'iPhone'}]

2 个答案:

答案 0 :(得分:2)

如果你想要一个dicts列表,其中每个dict对应一行,试试这个:

list_of_dicts = [{key: value for (key, value) in zip(header, line.strip().split('; '))} for line in open('abcd.txt') if not line.strip().startswith('#')]

答案 1 :(得分:0)

for line in open('data.txt'):
    if not line.startswith('#'):
        data.append(line.split("; "))

至少假设我理解正确

或更简洁

data = [line.split("; ") for line in open("data.txt") if not line.strip().startswith("#")]
list_of_dicts = map(lambda row:dict(zip(header,row)),data)

取决于您的python版本,您可以从地图返回迭代器,在这种情况下只需执行

 list_of_dicts = list(map(lambda row:dict(zip(header,row)),data))