Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串转换为日期列表_Python_Python 3.x - Fatal编程技术网

Python 将字符串转换为日期列表

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

我正在读取一个日期列表,该列表已作为字符串文件保存到sql文件中,其格式为
“[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应用程序,与安全性无关。