美文网首页
implementation and "ISSUE" colle

implementation and "ISSUE" colle

作者: 宣雄民 | 来源:发表于2019-06-21 14:05 被阅读0次
    1. when copy file with shutil and os.listdir()
    IsADirectoryError: [Errno 21]
    
    • The problem comes from the use of os.listdir() returns both files and folders which causes the confusion for shutil.copy() function.
    • The resolution is the use of os.walk() function instead of os.listdir()
    1. How to copy folder from source to deset in python.
    • The why to copy folder form one place to another place is shutil.copytree.
    • The key usage of this function is to make sure the dest location is a completely new location.
    • Demo code for copying one folder with many of the sub-folders into another location
    import pandas as pd
    import os
    import shutil
    
    file_path    = '../DSB3/stage1'
    target_path  = '/media/loveplay1983/dl_lab/thesis/LungNoduleDetectionClassification/DSB3/malignancies'
    csv_path     = '../DSB3'
    
    malig_tbl    =  pd.concat([pd.read_csv(csv_path+'/stage1_labels_1397.csv'), \
                             pd.read_csv(csv_path+'/stage1_solution_198.csv')])
    malig_tbl.head()
    
    patients     = malig_tbl['id'].values
    status       = malig_tbl['cancer'].values
    
    print(patients, status)
    nods_file    = os.listdir(file_path)
    nods_index = []
    
    for i, each in enumerate(status):
      if each == 1:
          nods_index.append(i)
      
    nodes = malig_tbl.iloc[nods_index]
    
    nodes_true = []
    for each in nods_file:
      for i, r in nodes.iterrows():
          if each == r.id:
              nodes_true.append(each)
              
    print(len(nodes_true))
    inx = 0
    while inx != 419:
      for each in nodes_true:
          shutil.copytree(file_path+'/{}'.format(each), target_path+'/nods_{}'.format(inx))
          inx += 1  
    
    1. Python create and delete file demo
    #!/usr/bin/python
    #-*-coding:utf-8-*-       #指定编码格式,python默认unicode编码
     
    import os
    directory = "./dir"
    os.chdir(directory)  #切换到directory目录
    cwd = os.getcwd()  #获取当前目录即dir目录下
    print("------------------------current working directory------------------")
     
    def deleteBySize(minSize):
        """删除小于minSize的文件(单位:K)"""
        files = os.listdir(os.getcwd())  #列出目录下的文件
        for file in files:
            if os.path.getsize(file) < minSize * 1000:
                os.remove(file)    #删除文件
                print(file + " deleted")
        return
     
    def deleteNullFile():
        '''删除所有大小为0的文件'''
        files = os.listdir(os.getcwd())
        for file in files:
            if os.path.getsize(file)  == 0:   #获取文件大小
                os.remove(file)
                print(file + " deleted.")
        return
     
    def create():
        '''根据本地时间创建新文件,如果已存在则不创建'''
        import time
        t = time.strftime('%Y-%m-%d',time.localtime())  #将指定格式的当前时间以字符串输出
        suffix = ".docx"
        newfile= t+suffix
        if not os.path.exists(newfile):
            f = open(newfile,'w')
            print newfile
            f.close()
            print newfile + " created."
        else:
            print newfile + " already existed."
        return
    hint = '''funtion:
                1   create new file
                2   delete null file
                3   delete by size
    please input number:'''
    while True:
        option = raw_input(hint)  #获取IO输入的值
        if cmp(option,'1') == 0:
            create()
        elif cmp(option,'2') == 0:
            deleteNullFile()
        elif cmp(option,'3') == 0:
            minSize = raw_input("minSize(K):")
            deleteBySize(minSize)
        elif cmp(option,'q') == 0:
            print "quit !"
            break
        else:
            print ("disabled input ,please try again....")
    
    1. Lamda expression (转自https://www.cnblogs.com/hf8051/p/8085424.html)
    • 应用在函数式编程中

    Python提供了很多函数式编程的特性,如:map、reduce、filter、sorted等这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。如下:

    需求:将列表中的元素按照绝对值大小进行升序排列

    list1 = [3,5,-4,-1,0,-2,-6]
    sorted(list1, key=lambda x: abs(x))
    当然,也可以如下:
    
    list1 = [3,5,-4,-1,0,-2,-6]
    def get_abs(x):
        return abs(x)
    sorted(list1,key=get_abs)
    

    只不过这种方式的代码看起来不够Pythonic

    • 应用在闭包中
    def get_y(a,b):
         return lambda x:ax+b
    y1 = get_y(1,1)
    y1(1) # 结果为2
    

    当然,也可以用常规函数实现闭包

    def get_y(a,b):
        def func(x):
            return ax+b
        return func
    y1 = get_y(1,1)
    y1(1) # 结果为2
    

    只不过这种方式显得有点啰嗦

    那么是不是任何情况下lambda函数都要比常规函数更清晰明了呢?
    肯定不是。
    Python之禅中有这么一句话:Explicit is better than implicit(明了胜于晦涩),就是说那种方式更清晰就用哪一种方式,不要盲目的都使用lambda表达式。

    相关文章

      网友评论

          本文标题:implementation and "ISSUE" colle

          本文链接:https://www.haomeiwen.com/subject/xuoeqctx.html