如果可以',则死亡;不能用python打开文件
我正在尝试将一个简单的perl程序转换为python,它将在文本文件中附加一个日志条目。但我不知道如果它找不到文件怎么让它死 下面是我的perl代码:如果可以',则死亡;不能用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
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上运行了它。作品