我想阅读以下文本文件:
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}]
有没有人知道如何开始这样做,或者我可以看到的任何资源?
答案 0 :(得分:4)
您可以使用csv.DictReader
来读取CSV文件,使用第一行作为字典键名,并将每行解析为字典(在这种情况下,您将失去字段顺序,因为字典不可靠排序)。然后,您可以使用datetime.datetime
's strptime
method将日期从字符串转换为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的通用解决方案,但如果您上面给出的示例具有代表性,它将起作用。
答案 1 :(得分: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)))]