Пути и разрешения в Windows - PullRequest
1 голос
/ 06 ноября 2011

Я написал быстрый и легкий способ взломать каталоги (в stepmania song dir), найти conf-файлы и назвать каталог, в котором находятся conf-файлы, с определенным именем, найденным в conf-файле. Это прекрасно работает на моей коробке Linux. Но не у моей жены Windows XP-box работает как админ. Я получаю разрешение-ошибка. В чем дело? Вот код:



#!/usr/bin/env python
# -*- coding:utf-8 -*-

from __future__ import with_statement

import os
import re
import sys

def renamer(in_path):
    for (path, dirs, files) in os.walk(in_path):
        exts = ['.sm', '.dwi'] # Only search files with this suffix
        conf_files = [] 

        # Create list with conf-files
        for ext in exts:
            conf_files.extend([file for file in files if file.lower().endswith(ext)])

        # Search for conf-files in directory 
        for conf_file in conf_files:
            try:
                with open(os.path.join(path, conf_file)) as f:
                    match = re.search('TITLE:\s?(.*);', f.read()) # Search for whatever follows "TITLE:"
                    new_dir_name = match.group(1) # The new dir-name is whatever the TITLE states in conf-file
                    os.rename(path, os.path.join(path, '..', new_dir_name)) 
            except IndexError:
                print 'No conf-file in', path

if __name__ == '__main__':
    path = sys.argv[1].replace('\\', '/') # Windowsify the path
    renamer(path)


Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Windows не может переименовать путь с открытым файлом.Это должно работать, если вы переместите вызов os.rename из блока with, чтобы файл был закрыт.Однако вы повторяете это для нескольких файлов по одному пути, и имя каталога в path больше не будет существовать после его переименования.Кроме того, os.walk не может проходить через подкаталоги после того, как вы переименовали родительский каталог.

Я бы проверял файлы конфигурации во время обхода дерева и добавлял (path, new_path) кортежи в список.Тогда я переименую каталоги в обратном порядке.

Кроме того, match может быть None, в этом случае попытка получить доступ к match.group вызовет AttributeError.И системные вызовы Windows, похоже, отлично справляются со смешанными разделителями на тот случай, если вы захотите пропустить шаг «Windowsify».Чтобы очистить путь для печати / регистрации, os.path.normpath последовательно использует os.path.sep, а также разрешает '.'и «..» на пути.

0 голосов
/ 06 ноября 2011

Вы забыли поставить букву диска на вашем пути, как C:\? Распечатайте значение path в самом низу вашего кода и посмотрите, дает ли оно вам то, что вы можете непосредственно вставить в проводник Windows.

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