关于python:如果打开成功则写入Pythonic方式

Pythonic way of write if open is successful

如果打开文件成功,我正在寻找创建和写入文件的方法,否则返回错误(例如,权限被拒绝)。

我在这里读到,条件变量初始化的方法是什么?。尽管我不确定此方法是否如我尝试的那样有效。

1
os.write(fd,String) if (fd = os.open(str("/var/www/file.js"),os.O_RDWR)) else return HttpResponse("error on write")

它应该是一条单行线。

当我执行上述操作时,会出现语法错误,例如:

1
2
3
    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 `

是否有更多和正确的一行或两行肾盂线能够做到这一点?


我会这样做:

1
2
3
4
5
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)

编辑评论,谢谢您的输入!


我强烈建议使用这种语法,而不是嵌套try和with语句(如果内部代码引发了ioerror,则会丢失ioerror)。它会导致少一个嵌套,并确保ioerror是由于打开而发生的。这样,您就没有机会捕获不需要的异常,并且您有更多的控制权。

1
2
3
4
5
6
7
8
9
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()

没有真正的Python式的方式来做它作为一个班轮,这通常是一个好主意,避免长一班轮。


如果你想成为一个Python,在设计你的代码时,一定要追求可读性。老实说,在try/except中包装一些东西并相应地控制您的逻辑是完全没有问题的。

aka,eafp->请求宽恕比请求允许更容易。

此外,当您写入文件时,最好使用上下文管理器。

因此,这可以很容易地转化为如下内容:

1
2
3
4
5
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))


既然你在问Python做什么,我认为你应该考虑请求宽恕,而不是许可的模式。也就是说,只需执行该操作,如果不起作用,则捕获适当的异常。

例如,

1
2
3
4
5
6
7
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。那就抓住它。

1
2
3
4
try:
    open('/usr/tmp.txt', 'w').write('hello')
except IOError:
    ...

AlexMartelli曾经谈到过这个问题,并描述了一些关于检查权限的固有谬误。在这些问题上有一个固有的种族。打开文件时,您始终可以拥有写入权限,但在以后尝试写入时,您不能这样做。无论如何,您必须处理异常,所以您最好使用它们进行构建。