我正在寻找一种创建和写入文件的pythonic方法,如果打开它成功,或者如果没有则返回错误(例如,权限被拒绝)。
我在这里阅读What's the pythonic way of conditional variable initialization?。虽然我不确定这种方法是否有效,但我试图测试它。
os.write(fd,String) if (fd = os.open(str("/var/www/file.js"),os.O_RDWR)) else return HttpResponse("error on write")
它应该是一个单行。
当我执行上述操作时,我会收到语法错误:
os.write(fd,String) if (fd = os.open(str("/var/www/file.js"),os.O_RDWR)) else return HttpResponse("error on write")
^
SyntaxError: invalid syntax `
是否有更多更正确的pythonic one-line或two-liner能够实现这一目标?
答案 0 :(得分:12)
我会做这样的事情:
try:
with open('filename.ext', 'w+') as f:
f.write("Hello world!")
except IOError as e:
print("Couldn't open or write to file (%s)." % e)
对评论进行了编辑,感谢您的意见!
答案 1 :(得分:3)
既然你在询问Pythonic做什么事情,我认为你应该考虑Ask Forgiveness, Not Permission范式。也就是说,只需执行操作,如果它没有工作就捕获相应的异常。
例如,
In [1]: open('/usr/tmp.txt', 'w').write('hello')
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-1-cc55d7c8e6f9> in <module>()
----> 1 open('/usr/tmp.txt', 'w').write('hello')
IOError: [Errno 13] Permission denied: '/usr/tmp.txt'
如果没有权限进行操作,则会抛出IOError
。那就抓住吧。
try:
open('/usr/tmp.txt', 'w').write('hello')
except IOError:
...
Alex Martelli曾经谈过这个问题,并描述了一些关于检查权限的固有谬误。在这些问题上存在固有的竞争。您可以在打开文件时始终具有写入权限,但在您尝试编写时不能写入。无论如何,你必须处理异常,所以你也可以用它们构建。
答案 2 :(得分:3)
如果你想成为Pythonic,在设计代码时总要考虑可读性。说实话,在try/except
中包装内容并相应地控制你的逻辑绝对没有错。
AKA,EAFP - &gt;比宽容更容易要求宽恕。
此外,当您写入文件时,最好使用上下文管理器。
所以,这很容易转化为这样的东西:
try:
with open('your_file', 'w') as f:
f.write(your_data)
except (OSError, IOError) as exc:
print("Your file could not be written to, your exception details are: {}".format(exc))
答案 3 :(得分:3)
我强烈建议使用这种语法,而不是嵌套try和with语句(并且在内部代码引发的情况下错过了IOError)。它导致一个较少的嵌套,并确保由于打开而发生IOError。这样,您就无法捕获不需要的异常,并且您可以获得更多控制权。
f = None
try:
f = open('file', 'w+')
except IOError:
print("Couldn't open the file")
else:
f.write('You are opened')
finally:
if f: f.close()
没有真正的pythonic方式可以将它作为一个衬垫,并且避免使用长衬垫通常是一个好主意。