Python 将字符串转换为日期列表
我正在读取一个日期列表,该列表已作为字符串文件保存到sql文件中,其格式为Python 将字符串转换为日期列表,python,python-3.x,Python,Python 3.x,我正在读取一个日期列表,该列表已作为字符串文件保存到sql文件中,其格式为“[datetime.date(2003,2,4),datetime.date(2003,2,6)]”。有没有一种简单的方法可以将字符串再次转换为原始格式 [n.b.我所能想到的就是用正则表达式对其进行解析,但我希望有一种更简单的方法]这一点,但eval是危险的,因此您可能需要正则表达式来检查它是否符合您期望的格式 import re import datetime strdates = "[datetime.date(2
“[datetime.date(2003,2,4),datetime.date(2003,2,6)]”
。有没有一种简单的方法可以将字符串再次转换为原始格式
[n.b.我所能想到的就是用正则表达式对其进行解析,但我希望有一种更简单的方法]这一点,但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
因此,如果您信任您的数据库,您可以删除正则表达式。这一点,但是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
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('),')]
因此,如果您信任您的数据库,您可以删除正则表达式
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)]
输出:
[datetime.datetime(2003, 4, 2, 0, 0), datetime.datetime(2003, 6, 2, 0, 0)]
您可以将代码转换为
ast。literal\u 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
的潜在安全问题,但仍然相当简单。您可以将代码转换为ast。literal\u 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
的潜在安全问题,但仍然相当简单。有时候,regex确实是这项工作的正确工具-我不认为以下代码太复杂,而且它的意图似乎非常明确:
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]
有时候,regex确实是完成这项工作的合适工具——我不认为下面的代码太复杂,它的意图似乎非常明确:
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]
你的意思是将datetime对象转换为字符串吗?不是-它位于字符串字段中(即,
[datetime.date(2003,2,4)
]只是文本)-我想将其转换回日期列表。等等,整个事情就是这样的字符串:“[datetime.date(2003,2,4),datetime.date(2003,2,6)]”
?是的-它以前是python中的一个日期列表,但作为字符串保存到sql中-我想转换回日期列表就像感恩节里一个不受欢迎的疯狂叔叔一样,我可以听到eval
在这个问题上悄然出现的声音你是说从datetime对象转换成字符串吗?不-它在字符串字段中(即,[datetime.date(2003,2,4)…
]只是文本)-我想将其转换回日期列表。等等,这样整件事就是这样的字符串:“[datetime.date(2003,2,4),datetime.date(2003,2,6)]”
?是的-它以前是python中的一个日期列表,但被保存到sql中作为字符串-我想转换回日期列表就像一个不受欢迎的疯狂叔叔在感恩节一样,我可以听到eval
在这个问题上悄悄出现的声音eval
是危险的,所以我看不出你有什么理由在all@TerryA这个re,更新了警告。这应该会使你的论点无效。那不是你真正的答案。你基本上是说“不要做x,做y,但这是x”。Show'y:)@TerryA更新了代码。但实际上,这个问题并不涉及安全相关的东西。这是一个有效的eval应用程序,与安全性无关。eval
是危险的,因此我看不出您有什么理由在all@TerryA在那里,更新了警告。这应该会使你的论点无效。那么这不是你真正的答案,是吗。你基本上是说“不要做x,做y,但这是x”。Show'y':)@TerryA更新了代码。但实际上,这个问题并不涉及安全相关的东西。这是一个有效的eval应用程序,与安全性无关。