fileinput.py 删除目标文件

2 投票
2 回答
1004 浏览
提问于 2025-04-17 17:00

我在使用 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 权限时,都会发生同样的事情。我在 bashcshksh 中都复现了这个问题。

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错误追踪网站上提个问题。

撰写回答