1. 计算两个日期之间的工作日
完全可以用datetime 模块搞定。我以随机10年前的某一天开始,到今天结束,算其中的工作日。
代码如下:
代码实现比较笨,从某一天,依次+1天,看是否在周末里面,然后从总天数里面减去1。
-
def work_day():
-
today=datetime.date.today()
-
random_date=today-datetime.timedelta(random.randint(1,10*365))
-
print(random_date)
-
days=today.toordinal()-random_date.toordinal()
-
day_delta=days
-
for i in range(1,days):
-
newday=random_date+datetime.timedelta(days=i)
-
if newday.weekday() in [5,6]:
-
day_delta-=1
-
print("random date is {0},and today is {1},deltaday is {2}, the work-days between these 2 days are {3}".format(random_date,today,days,day_delta))
2.
计算目录之间的相对路径
EG: from /a/b/c/d to /a/b/c1/d1 -> ../../c1/d1
from /a/b/c/d to /a/b/c/d ->
from c:/x/y/z to d:/x/y/z -> d:/x/y/z
这个倒是有点意思了,我发现Pathlib 和os.path 里面有些函数会去看文件是否真的存在。
例如os.path.samefile() 这个函数就会这么做。
还例如:
path.resolve() 也会报Exception.
If the path doesn’t exist, is raised. If an infinite loop is encountered along the resolution path, is raised.
-
path=pathlib.Path('/a/b/c/d')
-
try:
-
print(path.resolve())
-
except Exception as e:
-
print(e)
-
pass
-
-
print(path.relative_to("/"))
所以我直接把文件路径当作 字符串来处理,不调用任何os.path的方法,这样倒是可以。代码如下
-
def get_rel_path(f1,f2):
-
if "/" in f1:
-
sep="/"
-
else:
-
sep="\\"
-
-
pattern=re.compile(r"\\|/")
-
l1=re.split(pattern,f1)
-
l2=re.split(pattern,f2)
-
-
if l1[0]=="":
-
l1=l1[1:]
-
if l2[0]=="":
-
l2=l2[1:]
-
-
if l1==l2:
-
print("")
-
else:
-
ll=[]
-
for i in range(len(l2)):
-
if l1[i]!=l2[i]:
-
ll.extend(l2[i:])
-
break
-
if l1[i]==l2[i]:
-
ll.append("..")
-
final=sep.join(ll)
-
print(final)
-
-
get_rel_path('/a/b/c/d','/a/b/c1/d1')
-
get_rel_path('/a/b/c/d','/a/b/c/d')
-
get_rel_path(r'c:\x\y\z',r'd:\x\y\z')
-
get_rel_path('d:\\x\\y\\z1','d:\\x\\y1\\z1')
当然我也尝试了下用os.path 来实现。
但是结果就不是那么好看了。对于windows的路径处理是错误的。
-
#find f1 relative_to f2
-
def get_relative_path(f1,f2):
-
#if os.path.samefile(f1,f2:
-
# print("")
-
p1=os.path.abspath(f1)
-
#p1abspath=os.path.split(p1)
-
pathlist1=p1.split(os.sep)
-
p2=os.path.abspath(f2)
-
#p2abspath=os.path.split(p2)
-
pathlist2=p2.split(os.sep)
-
if pathlist1[0]=="":
-
pathlist1=pathlist1[1:]
-
if pathlist2[0]=="":
-
pathlist2=pathlist2[1:]
-
if p1==p2:
-
print("")
-
else:
-
ll=[]
-
for i in range(len(pathlist1)):
-
if pathlist1[i]!=pathlist2[i]:
-
ll.extend(pathlist2[i:])
-
break
-
else:
-
ll.append("..")
-
final=os.sep.join(ll)
-
print(final)
-
-
get_relative_path('/a/b/c/d','/a/b/c1/d1')
-
get_relative_path('/a/b/c/d','/a/b/c/d')
-
get_relative_path('c:\\x\\y\\z','d:\\x\\y\\z')
结果是os.path.abspath()让我大吃一惊,os.path.normpath() 才是我们应该用的。
-
print(os.path.abspath("c:\\x\\y\\z"))
-
/usr/local/src/c:\x\y\z
-
print(os.path.normpath("c:\\x\\y\\z"))
-
c:\x\y\z
直接把cwd 加入了传入的目录字符串前面,os.path.split() 也并不会返回一个我们期望的tuple.
-
print(os.path.split("/a/b/c/d"))
-
print(os.path.split("/a/b/c/"))
-
('/a/b/c', 'd')
-
('/a/b/c', '')
Bonus:
发现了一个python 很tricky 的地方。
-
"""
-
print(os.path.abspath(r"c:\x\y\z"))
-
"""
-
"""
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 27-28: truncated \xXX escape
如果把多行注释去掉,该语句是又是可以执行的。
用filter 来处理列表,
-
l2=list(filter(None,l2))
-
l1=list(filter(None,l1))
阅读(935) | 评论(0) | 转发(0) |