我正在读取一个日期列表,这些日期已作为字符串文件保存到sql文件中 - 它的格式为"[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
。是否有一种简单的方法可以将其从字符串转换为原始格式?
[n.b。所有我能想到的都是用正则表达式解析它,但我希望有一种更简单的方法]
答案 0 :(得分:3)
您可以将代码转换为ast.literal_eval
可以解析的内容,然后将其转换回datetime.date
个对象:
import ast
import datetime
d = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
dates = [datetime.date(*args) for args in ast.literal_eval(d.replace('datetime.date', ''))]
这可以避免eval
的潜在安全问题,同时仍然相当简单。
答案 1 :(得分:1)
from dateutil.parser import parse
d = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
reverse_date = lambda x: ','.join(x.split(',')[::-1])
clean_up = lambda x: x.replace('datetime.date(','').replace(')','')
[parse(reverse_date(clean_up(x))) for x in d[1:-1].split('),')]
输出:
[datetime.datetime(2003, 4, 2, 0, 0), datetime.datetime(2003, 6, 2, 0, 0)]
答案 2 :(得分:1)
有时候,正则表达式确实是工作的正确工具 - 我不认为以下代码过于复杂,而且其意图似乎非常明确:
from dateutil.parser import parse
import re
s = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
c = re.compile("datetime.date\((.*?)\)")
date_strings = c.findall(s)
print [parse(date_string).date() for date_string in date_strings]
如果您无法访问dateutil
模块,那么您还可以推送自己的parse
功能:
import datetime
import re
def parse(s):
year, month, day = s.split(', ')
year, month, day = int(year), int(month), int(day)
return datetime.date(year, month, day)
s = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
c = re.compile("datetime.date\((.*?)\)")
date_strings = c.findall(s)
print [parse(date_string) for date_string in date_strings]
答案 3 :(得分:0)
这个,但是eval是危险的,所以你可能想要正则它来检查它是否是你期望的格式。
import re
import datetime
strdates = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
if re.search(r"\[(datetime\.date\(\d{4},\ *\d{1,2},\ *\d{1,2}\),?\ *)+]", strdates):
dates = eval(strdates)
for date in dates:
print date
因此,如果您信任您的数据库,则可以删除正则表达式。