Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1790093
  • 博文数量: 297
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 3006
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-06 22:04
个人简介

Linuxer, ex IBMer. GNU https://hmchzb19.github.io/

文章分类

全部博文(297)

文章存档

2020年(11)

2019年(15)

2018年(43)

2017年(79)

2016年(79)

2015年(58)

2014年(1)

2013年(8)

2012年(3)

分类: Python/Ruby

2016-05-10 12:10:08

1. 计算两个日期之间的工作日
完全可以用datetime 模块搞定。我以随机10年前的某一天开始,到今天结束,算其中的工作日。
代码如下:
代码实现比较笨,从某一天,依次+1天,看是否在周末里面,然后从总天数里面减去1。

点击(此处)折叠或打开

  1. def work_day():
  2.     today=datetime.date.today()
  3.     random_date=today-datetime.timedelta(random.randint(1,10*365))
  4.     print(random_date)
  5.     days=today.toordinal()-random_date.toordinal()
  6.     day_delta=days
  7.     for i in range(1,days):
  8.         newday=random_date+datetime.timedelta(days=i)
  9.         if newday.weekday() in [5,6]:
  10.             day_delta-=1
  11.     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.

点击(此处)折叠或打开

  1. path=pathlib.Path('/a/b/c/d')
  2. try:
  3.     print(path.resolve())
  4. except Exception as e:
  5.     print(e)
  6.     pass

  7. print(path.relative_to("/"))
所以我直接把文件路径当作 字符串来处理,不调用任何os.path的方法,这样倒是可以。代码如下

点击(此处)折叠或打开

  1. def get_rel_path(f1,f2):
  2.     if "/" in f1:
  3.         sep="/"
  4.     else:
  5.         sep="\\"

  6.     pattern=re.compile(r"\\|/")
  7.     l1=re.split(pattern,f1)
  8.     l2=re.split(pattern,f2)
  9.     
  10.     if l1[0]=="":
  11.         l1=l1[1:]
  12.     if l2[0]=="":
  13.         l2=l2[1:]

  14.     if l1==l2:
  15.         print("")
  16.     else:
  17.         ll=[]
  18.         for i in range(len(l2)):
  19.             if l1[i]!=l2[i]:
  20.                 ll.extend(l2[i:])
  21.                 break
  22.             if l1[i]==l2[i]:
  23.                 ll.append("..")
  24.         final=sep.join(ll)
  25.         print(final)

  26. get_rel_path('/a/b/c/d','/a/b/c1/d1')
  27. get_rel_path('/a/b/c/d','/a/b/c/d')
  28. get_rel_path(r'c:\x\y\z',r'd:\x\y\z')
  29. get_rel_path('d:\\x\\y\\z1','d:\\x\\y1\\z1')
当然我也尝试了下用os.path 来实现。
但是结果就不是那么好看了。对于windows的路径处理是错误的。

点击(此处)折叠或打开

  1. #find f1 relative_to f2
  2. def get_relative_path(f1,f2):
  3.     #if os.path.samefile(f1,f2:
  4.     # print("")
  5.     p1=os.path.abspath(f1)
  6.     #p1abspath=os.path.split(p1)
  7.     pathlist1=p1.split(os.sep)
  8.     p2=os.path.abspath(f2)
  9.     #p2abspath=os.path.split(p2)
  10.     pathlist2=p2.split(os.sep)
  11.     if pathlist1[0]=="":
  12.         pathlist1=pathlist1[1:]
  13.     if pathlist2[0]=="":
  14.         pathlist2=pathlist2[1:]
  15.     if p1==p2:
  16.         print("")
  17.     else:
  18.         ll=[]
  19.         for i in range(len(pathlist1)):
  20.             if pathlist1[i]!=pathlist2[i]:
  21.                 ll.extend(pathlist2[i:])
  22.                 break
  23.             else:
  24.                 ll.append("..")
  25.         final=os.sep.join(ll)
  26.         print(final)

  27. get_relative_path('/a/b/c/d','/a/b/c1/d1')
  28. get_relative_path('/a/b/c/d','/a/b/c/d')
  29. get_relative_path('c:\\x\\y\\z','d:\\x\\y\\z')
结果是os.path.abspath()让我大吃一惊,os.path.normpath() 才是我们应该用的。

点击(此处)折叠或打开

  1. print(os.path.abspath("c:\\x\\y\\z"))
  2. /usr/local/src/c:\x\y\z
  3. print(os.path.normpath("c:\\x\\y\\z"))
  4. c:\x\y\z
直接把cwd 加入了传入的目录字符串前面,os.path.split() 也并不会返回一个我们期望的tuple. 

点击(此处)折叠或打开

  1. print(os.path.split("/a/b/c/d"))
  2. print(os.path.split("/a/b/c/"))
  3. ('/a/b/c', 'd')
  4. ('/a/b/c', '')
Bonus: 
发现了一个python 很tricky 的地方。

点击(此处)折叠或打开

  1. """
  2. print(os.path.abspath(r"c:\x\y\z"))
  3. """
  4. """
    SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 27-28: truncated \xXX escape

如果把多行注释去掉,该语句是又是可以执行的。 
用filter 来处理列表,


点击(此处)折叠或打开

  1. l2=list(filter(None,l2))
  2. l1=list(filter(None,l1))


阅读(935) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~