0

我正在用 Python 2.7 编写一个程序,它检索远程文件并将它们转储到用户可以指定的目录中。目前,为了验证程序实际上是否可以写入该目录,我执行以下操作(假设 dumpdir 是一个包含要检查的目录名称的字符串):

try:
    os.mkdir(dumpdir+'/.mwcrawler')
    os.rmdir(dumpdir+'/.mwcrawler')
except:
    logging.error('Could not open %s for writing, using default', dumpdir)

但这感觉比我通常的代码更骇人听闻。这样做的正确方法是什么?也许某种关于特权的断言?

4

2 回答 2

2

链接描述了 的用法os.access,这是一种专门为您的需要而创建的方法。

它还解释了一种更好的进行权限检查的方法。

正如评论中正确提到的那样,os.access在一些特定情况下会出现问题,所以为了完全确定,“hit-n-run”方法实际上更好,尝试编写,捕获异常,看看发生了什么 - 从那里开始。

于 2013-01-29T03:02:46.263 回答
2

一般来说,请求宽恕比请求许可要好——你必须在编写每个文件时处理错误,所以为什么要提前检查呢?

但是,当你有一个用户界面时——甚至是一个命令行界面,你可以在写任何东西之前很久就读取一个 prefs 文件——用户尽快返回错误通常会更方便。只要这是您进行此检查的唯一原因,它就没有任何问题。

但是,有许多小方法可以改进检查方式

首先,您几乎不应该只使用except:而不指定任何内容。除了在不同版本的 Python 中捕获不同的东西(因此也会混淆习惯于其他版本的人类读者)这一事实之外,这意味着您无法区分不可写、错误的 Unicode 字符,甚至是代码中的拼写错误.

另外,如果无法写入,您的错误消息会显示“不可读”,这很奇怪。

其次,除非您确定没有人会拥有一个名为的文件.mwcrawler(例如,因为您拒绝传输以'.'或其他开头的文件),否则使用任何固定名称都是自找麻烦。更好的解决方案是使用例如tempfile.mkdtemp.

此外,如果您想要可移植,则应避免对路径使用字符串操作。这就是os.path(和更高级别的实用程序)的用途——因此您不必学习或考虑 Windows、zOS 等。

把它们放在一起:

try:
    d = tempfile.mkdtemp(prefix='.mwcrawler', dir=dumpdir)
except Exception as e:
    logging.error('Could not open %s for reading (%s), using default', dumpdir, e)
else:
    os.rmdir(d)
于 2013-01-29T03:06:59.397 回答