2013-02-25 74 views
2

我正在使用fileinput Python模块一些奇怪的行为。如果我正在尝试修改的文件没有用户读取权限,则会被删除。fileinput.py删除目标文件

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,cshksh中转载了此内容。

+0

Permission denied错误发生,因为含有TEST目录中的“W”权限丢失可能? – 2013-02-25 05:12:20

+0

@Cthulhu:似乎并非如此。另外,即使我在'/ tmp'中创建一个新目录并将'/ tmp/newDir'设置为'777'并在这个新目录中运行所有内容,我也可以确认它仍然在发生。 – gambol 2013-02-25 05:16:34

回答

1

你似乎使用inplace=1打开一个关于它的问题,所以是该文件有望被改写。 完成此操作后,将创建一个.bak文件,并覆盖初始文件名。

但是,你不权限读取inital文件(但可以写),所以在创建备份时,它是空的(或失败),和原来的覆盖。

就地文档: http://docs.python.org/2/library/fileinput.html#fileinput.FileInput

可选就地过滤:如果关键字参数就地= 1是 传递给fileinput.input()或所述的FileInput构造中,文件 被移动到备份文件和标准输出被引导到输入 文件(如果相同名称的文件作为备份文件已经存在,它 将被替换小号ilently)。这使得编写一个过滤器 可以重写其输入文件。如果备份参数给出 (“”通常作为备份=),它指定了 扩展为备份文件,和备份文件保持周围;通过 默认情况下,扩展名是“.bak的”,并在输出 关闭文件将被删除。当标准输入为 时,就地过滤被禁用。

+2

默默地丢失文件内容不是很好的行为。 'fileinput'不应该让你这样做。 – 2013-02-25 05:28:35

+1

程序设计并不适合弱者:P – monkut 2013-02-25 05:35:14