[英]PermissionError: when using os.remove and os.rename in a loop in python
[英]Is it wise to remove files using os.rename() instead of os.remove() in Python?
我有一个名为fin
的文件,需要修改。
在Python中,我创建了一个脚本,进行所需的修改,然后将其保存在名为fout
新文件中。
较旧的文件对我无用,因此我使用os.remove('fin')
删除了它。 但是,修改后的文件应命名为fin
,因此我使用os.rename('fout','fin')
。
我想到了一个使用os.rename('fout','fin')
的快捷方式,因为它是同一个名称,所以期望它删除fin
,但是我不确定这是否实际上是在删除旧文件或如果多次执行此操作可能会造成一些麻烦(执行此任务超过1000次)。
我的问题是:这是实现这一目标的最干净,最快的方法吗? 总之,我只想在原始文件中进行更正并覆盖它。
码:
import os
f = open('fin','w')
f.write('apples apple apples\napple apples apple\napples apple apples')
f.close()
with open('fin', 'rt') as fin:
with open('fout', 'wt') as fout:
for line in fin:
fout.write(line.replace('apples', 'orange'))
os.rename('fout', 'fin')
您的模式可以在POSIX系统上使用,但不能在Windows上使用。 我建议使用os.replace
以OS不可知的方式替换现有文件。 它要求使用Python 3.3或更高版本,但是无论如何,新代码通常应该以Python 3为目标。
这是首选模式,因为它可以保证原子性。 fin
文件之前或之后始终处于完整状态,没有失败的风险,导致文件处于部分/损坏状态。
从您的示例看来,您似乎没有理由逐行遍历文件。 如果是这样,这是一个非常简单的解决方案。
f = open('fin','w').write('apples apple apples\napple apples apple\napples apple apples')
s = open('fin').read().replace('apples', 'oranges')
open('fin','w').write(s)
为了实现交叉兼容性,我建议您将with代码反转。 我的建议代码是
f = open('fin','w')
f.write('apples apple apples\napple apples apple\napples apple apples')
f.close()
with open('fout', 'wt') as fout:
with open('fin', 'rt') as fin:
for line in fin.readlines():
fout.write(line.replace('apples', 'orange'))
os.unlink('fin')
os.rename('fout', 'fin')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.