Пути и разрешения в Windows

1

Я написал быстрый и легкий хак, чтобы ходить по каталогам (в папке stepmania 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
Лучший ответ

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

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

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

  • 0
    О, это имеет смысл. Я начну кодировать прямо сейчас! :-)
  • 0
    Я сделал. Большое спасибо! :)
0

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

  • 0
    Это кажется правильным. «Путь печати» как раз перед renamer (path) возвращает c: / traningspass (насколько я понимаю, это правильно)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню