Я написал быстрый и легкий хак, чтобы ходить по каталогам (в папке 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)
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
а также разрешает ".". и ".." на пути.
Забываете ли вы поместить букву диска на свой путь, например C:\
? Распечатайте значение path
в самом низу вашего кода и посмотрите, дает ли он вам что-то, что вы могли бы непосредственно вставить в проводник файлов Windows.