2013-02-25 5 views
2

Я получаю странное поведение, используя модуль python fileinput. Если файл, который я пытаюсь изменить, не имеет доступа к чтению пользователя, он удаляется.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, csh и ksh.

+0

Ошибка отклонения разрешения возникает, поскольку отсутствует разрешение «w» в каталоге, содержащем TEST, возможно? –

+0

@Cthulhu: Кажется, не так. Кроме того, я могу подтвердить, что это все еще происходит, даже если я создаю новый каталог в '/ tmp' и устанавливаю'/tmp/newDir' '777' и запускаю все внутри этого нового каталога. – gambol

ответ

0

Похож на ошибку в fileinput. Предложите вам открыть вопрос об этом на Python Bug Tracker

1

Вы, кажется, используете inplace=1, так что да, файл, как ожидается, будет перезаписан. Когда это делается, создается файл .bak, а исходное имя файла перезаписывается.

Однако вы не имеют разрешение на чтение щёток файла (но могут написать), поэтому при создании резервной копии он пуст (или не), а оригинал перезаписывается.

С INPLACE документации: http://docs.python.org/2/library/fileinput.html#fileinput.FileInput

Дополнительный Inplace фильтрация: если аргумент ключевого слова INPLACE = 1 является передается fileinput.input() или в конструктор FileInput , файл перемещается в файл резервной копии, а стандартный вывод направляется на вход файл (если файл с тем же именем, что и файл резервной копии, уже существует, то будет заменен s ilently). Это позволяет записать фильтр , который перезаписывает свой входной файл на место. Если параметр резервного копирования имеет значение (обычно как backup = '.'), Он указывает расширение для файла резервной копии, а файл резервной копии остается вокруг; по умолчанию , расширение является «.bak», и оно удаляется при закрытии выходного файла . Фильтрация на месте отключается, когда стандартный ввод равен .

+2

Тихая потеря содержимого файла - это не очень приятное поведение. 'fileinput' не должен позволять вам это делать. –

+1

Программирование не для слабых в сердце: P – monkut

+1

Правда, но, хотя Python для взрослых, для взрослых, это не совсем бессердечно. –

Смежные вопросы