在Python中将含日期的文本文件读入字典列表

0 投票
2 回答
796 浏览
提问于 2025-04-17 09:32

我想读取以下的文本文件:

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.datetimestrptime 方法把日期从字符串转换成 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,但如果你给出的例子是代表性的,那它是可以工作的。

撰写回答