Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果可以',则死亡;不能用python打开文件_Python - Fatal编程技术网

如果可以',则死亡;不能用python打开文件

如果可以',则死亡;不能用python打开文件,python,Python,我正在尝试将一个简单的perl程序转换为python,它将在文本文件中附加一个日志条目。但我不知道如果它找不到文件怎么让它死 下面是我的perl代码: my $file = 'journal.txt'; #input destination open my $fh, '>>', $file or die $!; #open file or kills it if error 我可以用python打开文件,但是如果找不到,我尝试过的任何东西都不会杀死它。到目前为止,我已经为pytho

我正在尝试将一个简单的perl程序转换为python,它将在文本文件中附加一个日志条目。但我不知道如果它找不到文件怎么让它死

下面是我的perl代码:

my $file = 'journal.txt'; #input destination
open my $fh, '>>', $file or die $!; #open file or kills it if error
我可以用python打开文件,但是如果找不到,我尝试过的任何东西都不会杀死它。到目前为止,我已经为python提供了以下内容:

with open('journal.txt', 'a') as file:
    file.write('input')

代码已经这样做了,因为
open('journal.txt','a')
调用将抛出,如果未能打开文件,则调用
IOError
OSError
)。如果您的程序没有捕捉到该错误,它最终将传播到堆栈顶部,并在打印回溯后退出解释器。

您可以捕捉异常以自行引发某些内容或在中处理替代逻辑,但以下情况除外:

try:
    with open('some_file'):
        # logic
except IOError:
    # do things with your exception

您拥有的代码将起作用,即如果Python进程无法打开文件,它将“死亡”

如果文件无法打开,例如由于权限不足,将引发异常。该异常未被捕获,因此它将传播到顶层,Python解释器最终将自动终止它

但是,它的行为与perl版本并不完全相同,例如,退出代码和错误消息会有所不同。您希望从Python进程中控制退出,并设置适当的退出代码。您可以通过捕获异常并访问错误消息和错误代码来实现这一点。通过进一步挖掘回溯,可以提供行号和文件名,然后可以生成更接近perl的输出

import sys

try:
    with open('journal.txt', 'a') as f:
        f.write('input')
except IOError as exc:    # Python 2. For Python 3 use OSError
    tb = sys.exc_info()[-1]
    lineno = tb.tb_lineno
    filename = tb.tb_frame.f_code.co_filename
    print('{} at {} line {}.'.format(exc.strerror, filename, lineno))
    sys.exit(exc.errno)
为了进行比较,perl在无法打开输出文件时会产生以下结果:

$ perl x.pl Permission denied at x.pl line 2. $ echo $? 13 $perl x.pl x.pl第2行的权限被拒绝。 $echo$? 13 上面的Python脚本生成以下内容:

$ python x.py Permission denied at x.py line 4. $ echo $? 13 $python x.py x.py第4行的权限被拒绝。 $echo$? 13
当你说“死”是什么意思?@Jason他说的是perl的命令你可以使用
try/except
语句,在找不到文件时打印出一个错误。如果文件不退出,则“a”将创建该文件,如果程序不存在,则希望程序出错?我认为您必须首先尝试阅读它,或者首先检查它是否存在(例如,
os.path.isfile(fname)
),描述您想要的行为比用另一种语言提供代码要好得多。1) 可以提供帮助的Python程序员可能不知道Perl,2)您可能不需要Perl功能的完全副本。(例如,如果Python的版本产生一个稍有不同的错误消息怎么办?这是否可以接受?)值得注意的是,如果该文件不存在,它将创建该文件,因此只有在创建失败(例如由于目录写入权限)或该文件存在且不可写入时才会失败。该程序不会死掉,它捕获异常并继续。可以在except中使用提升。是的,但是捕获异常然后重新提升它有什么意义?而且,这段代码在Python2中不起作用,仍然不会直接消亡;相反,它会做一些事情,然后可能会死掉。我只是在Python2.7.6上运行了它。作品