代码之家  ›  专栏  ›  技术社区  ›  blu

有没有更多的蟒蛇疗法?

  •  3
  • blu  · 技术社区  · 14 年前

    这是我的第一个python脚本,请注意。

    我把这个从《潜入巨蟒》中拼凑出来,效果很好。然而,由于这是我的第一个Python脚本,我将非常感谢关于如何改进它的任何提示,或者更好地采用Python编程方式的方法。

    import os
    import shutil
    
    def getSourceDirectory():
        """Get the starting source path of folders/files to backup"""
        return "/Users/robert/Music/iTunes/iTunes Media/"
    
    def getDestinationDirectory():
        """Get the starting destination path for backup"""
        return "/Users/robert/Desktop/Backup/"
    
    def walkDirectory(source, destination):
        """Walk the path and iterate directories and files"""
    
        sourceList = [os.path.normcase(f)
            for f in os.listdir(source)]
    
        destinationList = [os.path.normcase(f)
            for f in os.listdir(destination)]
    
        for f in sourceList:
            sourceItem = os.path.join(source, f)
            destinationItem = os.path.join(destination, f)  
    
            if os.path.isfile(sourceItem):
                """ignore system files"""
                if f.startswith("."):
                    continue
    
                if not f in destinationList:
                    "Copying file: " + f
                    shutil.copyfile(sourceItem, destinationItem)
    
            elif os.path.isdir(sourceItem):
                if not f in destinationList:
                    print "Creating dir: " + f
                    os.makedirs(destinationItem)
    
                walkDirectory(sourceItem, destinationItem)
    
    """Make sure starting destination path exists"""
    source = getSourceDirectory()
    destination = getDestinationDirectory()
    
    if not os.path.exists(destination):
        os.makedirs(destination)
    
    walkDirectory(source, destination)
    
    5 回复  |  直到 14 年前
        1
  •  6
  •   paprika    14 年前

    正如其他人提到的,您可能想使用 walk 从内置 os 模块。另外,考虑使用 PEP 8 compatible style (没有骆驼的箱子,但是 this_stye_of_function_naming() )将直接可执行代码(即没有库/模块)包装到 if __name__ == '__main__': ... 拦网也是一种很好的做法。

        2
  •  4
  •   msw    14 年前

    代码

    • 没有描述其功能的docstring
    • 重新发明“电池” shutil.copytree
    • 有一个函数调用 walkDirectory 它不做它名字所暗示的
    • 包含 get* 不提供实用程序的函数
      • 那些get函数嵌入的高级参数比它们应该嵌入的更深
    • 一定很健谈( print 不管你要不想要)
        3
  •  3
  •   Charlie Martin    14 年前

    使用 os.path.walk . 它为您完成了大部分的簿记工作;然后您只需向它提供一个访问者功能来完成您需要的工作。

    或者,哦,该死的,看起来os.path.walk已经被否决了。使用 os.walk 然后,你就会

    for r, d, f in os.walk('/root/path')
        for file in f:
           # do something good.
    
        4
  •  2
  •   JoshD    14 年前

    我建议使用 os.walk . 它会像你现在做的那样。它提供了一个很好的界面,很容易利用它来做任何你需要的事情。

        5
  •  1
  •   Tim McNamara    14 年前

    让事情更像蟒蛇的主要事情是采用python的pep8,风格指南。它使用下划线作为函数。

    如果返回的是固定字符串,例如get*函数,则变量可能是 更好的方法。我的意思是替换你的 getSourceDirectory 就这样:

    source_directory = "/Users/robert/Music/iTunes/iTunes Media/"
    

    添加以下条件意味着在导入模块时不会调用特定于将模块作为程序运行的代码。

    if __name__ == '__main__':
        source = getSourceDirectory()
        destination = getDestinationDirectory()
    
        if not os.path.exists(destination):
            os.makedirs(destination)
    
        walkDirectory(source, destination)
    

    我会用 try 和; except 块,而不是测试条件 walkDirectory 可以成功操作。多个进程和文件系统可能会发生奇怪的事情:

    try:
        walkDirectory(source, destination)
    except IOError:
        os.makedirs(destination)
        walkDirectory(source, destination)
    

    我遗漏了关于是否使用标准库的讨论。在您的Python之旅的这个阶段,我认为您只是在感受一下应该如何在一般情况下使用语言。我不认为知道 os.walk 现在真的很重要。