Почему Python не позволяет мне удалять файлы? - PullRequest
4 голосов
/ 05 июня 2009

Я создал скрипт Python, который получает список файлов из текстового файла и удаляет их, если они пусты. Он правильно обнаруживает пустые файлы, но не хочет их удалять. Это дает мне:

(32, 'The process cannot access the file because it is being used by another process')

Я использовал два разных инструмента, чтобы проверить, заблокированы ли файлы или нет, и я уверен, что это не так. Я использовал sysinternals Process Explorer и LockHunter. Кроме того, я могу самостоятельно удалить файлы вручную. Я, очевидно, не хочу делать это для всех из них, поскольку в разных местах их сотни.

Сценарий:

import os.path
import sys

def DeleteFilesFromListIfBlank(PathToListOfFiles):
    ListOfFiles = open(PathToListOfFiles)
    FilesToCheck = [];
    for line in ListOfFiles.readlines():
        if(len(line) > 1):
            line = line.rstrip();
            FilesToCheck.append(line)
    print "Found %s files to check.  Starting check." % len(FilesToCheck)

    FilesToRemove = [];
    for line in FilesToCheck:        
        #print "Opening %s" % line
        try:
            ActiveFile = open(line);
            Length = len(ActiveFile.read())
            if(Length < 691 and ActiveFile.read() == ""):
                print "Deleting %s" % line
                os.unlink(line);
            else:
                print "Keeping %s" % line
        except IOError,message:
            print "Could not open file: $s" % message
        except Exception as inst:
            print inst.args

DeleteFilesFromListIfBlank("C:\\ListOfResx.txt")

Я пытался использовать os.unlink и os.remove. Я использую Python 2.6 на Vista64

Спасибо

Ответы [ 5 ]

15 голосов
/ 05 июня 2009

Вам нужно вызвать .close() для файлового объекта, прежде чем пытаться удалить его.

Редактировать: И на самом деле вы вообще не должны открывать файл. os.stat() сообщит вам размер файла (и 9 других значений), даже не открывая файл.

Это (я думаю) делает то же самое, но немного чище (ИМХО):

import os

_MAX_SIZE = 691

def delete_if_blank(listFile):
    # Make a list of files to check.
    with open(listFile) as listFile:
        filesToCheck = filter(None, (line.rstrip() for line in listFile.readlines()))

    # listFile is automatically closed now because we're out of the 'with' statement.

    print "Found %u files to check. Starting check." % len(filesToCheck)

    # Remove each file.
    for filename in filesToCheck:
        if os.stat(filename).st_size < _MAX_SIZE:
            print "Deleting %s" % filename
            os.remove(filename)
        else:
            print "Keeping %s" % filename
9 голосов
/ 05 июня 2009

Попробуйте ActiveFile.close (), прежде чем выполнять отсоединение.

Также, чтение всего файла не обязательно, вы можете использовать os.path.getsize (filename) == 0.

6 голосов
/ 05 июня 2009

Это у вас , у которого открыт файл - вам нужно закрыть его, прежде чем пытаться удалить:

ActiveFile = open(line);
Length = len(ActiveFile.read())
ActiveFile.close()   # Insert this line!

или просто получить размер файла, не открывая файл:

Length = os.path.getsize(line)
4 голосов
/ 05 июня 2009

Вы открываете каждый файл, а затем пытаетесь удалить его? Если это так, попробуйте сначала закрыть его.

3 голосов
/ 05 июня 2009

Возможно, вам нужно закрыть дескриптор файла ActiveFile, прежде чем пытаться удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...