我在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)
但这比我通常的代码更加晦涩。什么是正确的方法去做?也许对特权有某种断言?
答案 0 :(得分:2)
此link描述了os.access
的用法,os.access
是专门为您的需求而创建的方法。
它还解释了一种更好的方法来处理权利检查。
正如在评论中正确提到的那样,{{1}}在一些特定情况下会有问题,所以为了完全确定,“命中运行”方法实际上更好,尝试写,捕获异常,看看发生了什么 - 从那里开始。
答案 1 :(得分: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)