在Python中将含日期的文本文件读入字典列表
我想读取以下的文本文件:
date candy
1/12/2011 300
1/20/2010 200
1/16/2010 200
然后把它转换成一个字典的列表,格式如下:
candysales= [ {'date': d(2011,1,12), 'sales': 300}, {'date': d(2010,1,20), 'sales': 200},{'date': d(2010,1,16), 'sales': 200}]
有没有人能给我一些建议,或者推荐一些我可以参考的资源?
2 个回答
3
你可以把整个文件读到一个字符串里
data = fin.read()
根据行来分割
data=data.splitlines()
使用列表推导式,比如这样
[dict((('date',datetime.datetime.strptime(k,"%m/%d/%Y")),('sales',v)))
for (k,v) in [e.split() for e in data.splitlines()[1:]]]
这样你会得到类似这样的结果
[{'date': datetime.datetime(2011, 1, 12, 0, 0), 'sales': '300'}, {'date': datetime.datetime(2010, 1, 20, 0, 0), 'sales': '200'}, {'date': datetime.datetime(2010, 1, 16, 0, 0), 'sales': '200'}]
如果一次性把整个文件读到内存里对你来说有问题,你可以这样做
>>> candysales=[]
>>> fin.readline() # To Skip the First Line
for d in fin:
k,v=d.split()
candysales+=[dict((('date',datetime.datetime.strptime(k,"%m/%d/%Y")),('sales',v)))]
4
你可以使用 csv.DictReader
,这个工具可以读取CSV文件,第一行会被当作字典的键名,然后把每一行解析成一个字典(不过要注意,这样会丢失字段的顺序,因为字典的顺序不一定可靠)。接着,你可以用 datetime.datetime
的 strptime
方法把日期从字符串转换成 datetime.date
对象,然后再转换成 date
:
candysales = []
for row in csv.DictReader(file('/path/to/sales.csv')):
row['date'] = datetime.strptime(row['date'], '%d/%m/%Y').date()
candysales.append(row)
补充:我刚刚注意到输入的格式不是CSV(看起来像是固定宽度格式)。csv
模块适用于CSV文件或以制表符分隔的文件,但可能不太适合这种固定宽度格式。如果你能控制这个文件的格式,使用CSV会是个不错的选择;如果不能,我们可以用 re
模块来转换:
def csvify(iterable):
for line in utterable:
yield re.sub('\s+', ',', line.rstrip())
candysales = []
for row in csv.DictReader(csvify(file('/path/to/sales.csv'))):
row['date'] = datetime.strptime(row['date'], '%d/%m/%Y').date()
candysales.append(row)
csvify
函数返回一个生成器,这个生成器会传递给 csv.DictReader
,它会从底层文件中逐行读取内容,首先把一个或多个空格替换成一个逗号,从而转换成CSV格式。
这可能并不是一个通用的解决方案来将固定宽度文本格式转换为CSV,但如果你给出的例子是代表性的,那它是可以工作的。