是否有更多的Pythonic方法?

时间:2010-10-17 02:37:57

标签: python

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

我将它从Dive Into 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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

代码

  • 没有文档字符串描述它的作用
  • 重新发明shutil.copytree
  • 的“电池”
  • 有一个名为walkDirectory的函数,它的名字并不意味着
  • 包含不提供实用程序的get*个函数
    • 那些获取功能的高级别参数比他们应该更深入地嵌入
  • 是强制性的(print无论你是否愿意)

答案 2 :(得分:3)

使用os.path.walk。它为您完成了大部分的簿记工作;然后,您只需向其提供访问者功能即可满足您的需求。

或者,该死的,看起来像os.path.walk已被弃用。然后使用os.walk,即可获得

for r, d, f in os.walk('/root/path')
    for file in f:
       # do something good.

答案 3 :(得分:2)

我建议使用os.walk。它做你看起来像你正在做的事情。它提供了一个很好的界面,可以很容易地用来做你需要的任何事情。

答案 4 :(得分:1)

使Pythonic更加生动的主要方面是采用Python的PEP8,风格指南。它使用下划线表示函数。 1

如果您要返回固定字符串,例如你的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)

1 我遗漏了关于是否使用标准库的讨论。在Python旅程的这个阶段,我认为你只是在想一下如何使用语言。我不认为现在知道os.walk的详细信息非常重要。