将带有日期的文本文件读入Python中的词典列表

将带有日期的文本文件读入Python中的词典列表,python,text,import,date,Python,Text,Import,Date,我想阅读以下文本文件: 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}] 有没有人知道如何开始这样做,或者有什么我可以查看的资源?您可

我想阅读以下文本文件:

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}]
有没有人知道如何开始这样做,或者有什么我可以查看的资源?

您可以使用它来读取CSV文件,使用第一行作为字典键名,并将每一行解析到字典中(在这种情况下,您将丢失字段顺序,因为字典的顺序不可靠)。然后,您可以使用将日期从字符串转换为
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的通用解决方案,但如果您上面给出的示例具有代表性,它将起作用。

您可以在一个字符串中读取整个文件

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)))]

你试过什么了吗?比如看一看a?列标题与生成的词典相关吗?
“candy”
似乎未使用。看起来
csv
模块可以使用空格作为分隔符。只迭代文件对象会更具pythonic风格(更高效)。这将生成以开结尾的行,这与拆分行不同,所以不要忘记使用
rstrip()
@dcrosta
rstrip()
将是多余的,因为不带参数的
split()
执行隐式
strip()
@ekhumoro如果对fin中的行执行
,则有必要执行
,其中每个
行都将包括尾随行-ending@dcrosta. 没有
line.split()
将在执行拆分之前删除所有前导和尾随空格(如上面答案中的第二个示例所示)。@ekhumoro对,我的意思是,如果您不使用
split
splitlines
,那么您需要使用
rstrip()
,以获得没有行尾的行。换句话说:
[line for line In file('something.txt')]!=[文件('something.text').read().splitlines()][code>中的行对行。