fileinput.py 删除目标文件
我在使用 fileinput
这个Python模块时遇到了一些奇怪的情况。如果我想修改的文件没有用户读取权限,它就会被删除。
import fileinput
try:
for line in fileinput.input('TEST', inplace=1):
line = line.strip()
if '/' in line:
print "PATH: " + line
else:
print line
except Exception as e:
print e
当我运行这个文件时,我得到了:
$ ls -l
--wxrwxrwx 1 myusername agqt3 0 Feb 25 11:02 TEST
$ python test.py
[Errno 13] Permission denied: 'TEST.bak'
$ ls -l
total 0
文件被删除了。每当权限设置中不包括用户的 r
权限时,都会发生同样的事情。我在 bash
、csh
和 ksh
中都复现了这个问题。
2 个回答
1
你似乎在使用 inplace=1
,所以文件会被覆盖。这样做的时候,会生成一个 .bak
的备份文件,然后原来的文件名就会被覆盖。
不过,你没有权限去读取原始文件(但可以写入),所以当备份文件创建的时候,它要么是空的(要么创建失败),而原始文件就被覆盖了。
关于 inplace 的说明可以参考文档: http://docs.python.org/2/library/fileinput.html#fileinput.FileInput
可选的就地过滤:如果在调用 fileinput.input() 或 FileInput 构造函数时传入关键字参数 inplace=1,文件会被移动到一个备份文件中,同时标准输出会指向输入文件(如果已经存在一个与备份文件同名的文件,它会被静默替换)。这样就可以写一个过滤器,直接在原文件上进行修改。如果提供了备份参数(通常是 backup='.'),它会指定备份文件的扩展名,备份文件会保留;默认情况下,扩展名是 '.bak',并且在输出文件关闭时会被删除。当读取标准输入时,就地过滤会被禁用。
0
看起来在fileinput
这个模块里有个错误。建议你在Python错误追踪网站上提个问题。