LINUX.ORG.RU

python, переименование путей

 os.path, ,


0

1

возникла проблема с переименованием пути допустим, имеется такая структура

dirs = ['test/test_subdir/test1', 'test/test_subdir/test2', 'test/test_subdir/test3']
мне необходимо привести все пути к нижнему регистру, кроме первой директори 'test'
root_path = 'test'
что я делаю
for i in dirs:
    relpath = os.path.relpath(i, root_path)
    src = i
    dest = os.path.join(root_path, relpath.upper())
    os.renames(src, dest)
    print src, '=>', dest

это что было ДО

$ find test
test
test/test_subdir
test/test_subdir/test1
test/test_subdir/test2
test/test_subdir/test3
Это после
find test
test
test/test_subdir
test/test_subdir/TEST1
test/test_subdir/TEST2
test/test_subdir/TEST3

А вот что надо получить

find test
test
test/TEST_SUBDIR
test/TEST_SUBDIR/TEST1
test/TEST_SUBDIR/TEST2
test/TEST_SUBDIR/TEST3

как видно, код не сработал или я не в том направлении копаюсь



Последнее исправление: yanmhlv (всего исправлений: 2)

dirs = ['test/test_subdir/test1', 'test/test_subdir/test2', 'test/test_subdir/test3']
root_path = 'test'
for d in dirs:
    rel = os.path.relpath(d, root_path)
    rel_up = os.path.join(*map(str.upper, os.path.split(rel)))
    new_path = os.path.join(root_path, rel_up)
    print new_path

оно?

s0rg
()
Ответ на: комментарий от yanmhlv

на вход даётся папка. Ты делаешь список всех сущностей. Если это файл то делаешь переименование. Если это папка то вызываешь эту же функцию на папку. При выходе из рекурсии переименовываешь и саму папку.

true_admin ★★★★★
()
Ответ на: комментарий от s0rg

Я вообще то так и сделал, твой код переименовывает только файлы. Как написал товарищ постом ниже, надо добавить в dirs еще и папки, то есть

dirs = ['test/test_subdir/test1', 'test/test_subdir/test2', 'test/test_subdir/test3']
dirs = [op.dirname(i) for i in dirs] + dirs
for i in dirs:
    relpath = op.relpath(i, root_path)
    os.renames(i, op.join(root_path, relpath.upper()))

yanmhlv
() автор топика
Ответ на: комментарий от yanmhlv
~: find test
test
test/test_subdir
test/test_subdir/test1
test/test_subdir/test2
test/test_subdir/test3
~: python path_test.py
~: find test          
test
test/TEST_SUBDIR
test/TEST_SUBDIR/TEST2
test/TEST_SUBDIR/TEST1
test/TEST_SUBDIR/TEST3

ЧЯДНТ?

s0rg
()

ТС, у тебя явные проблемы с техзаданием и тем, что ты пытаешься реализовать:

все пути к нижнему регистру

нижнему

А вот что надо получить

find test
test
test/TEST_SUBDIR
test/TEST_SUBDIR/TEST1
test/TEST_SUBDIR/TEST2
test/TEST_SUBDIR/TEST3

GateKeeper ★★
()
Ответ на: комментарий от GateKeeper

опечатка, к верхнему, естественно

yanmhlv
() автор топика
Ответ на: комментарий от s0rg
yanmihailov@air /tmp $ find test
test
test/test_subdir
test/test_subdir/test1
test/test_subdir/test2
test/test_subdir/test3
yanmihailov@air /tmp $ ./123.py 
yanmihailov@air /tmp $ find test
test
test/test_subdir
test/test_subdir/TEST1
test/test_subdir/TEST2
test/test_subdir/TEST3

и где же он работает? ЧЯДНТ?) вот твой код

root_path = 'test'
filelist = ['test/test_subdir/test1', 'test/test_subdir/test2', 'test/test_subdir/test3']
for fname in filelist:
    if not op.isdir(op.dirname(fname)):
        os.makedirs(op.dirname(fname))
    with open(fname, 'wb') as fh:
        fh.write(os.urandom(1))

for d in filelist:
    rel = os.path.relpath(d, root_path)
    rel_up = os.path.join(*map(str.upper, os.path.split(rel)))
    new_path = os.path.join(root_path, rel_up)
    os.renames(d, new_path)
    print new_path

у меня проблема возникает, когда много директорий и файлов, половина путей не переименовывается. С чем связано - не могу понять. вот мой пример, на котором не работает код из этого сообщения. Там есть код и дамп структуры каталогов, к которому надо привести созданные пути(это все лабораторные испытания, настолько рандомных регистров не будет. Предполагается, что пути могут быть названы примерно так: Lib/LIB/lib и надо привести к эталонному варианту такой путь).

yanmhlv
() автор топика
Ответ на: комментарий от yanmhlv

В твоем примере пути хранятся в юникоде. С которым естественно не работает str.upper. Вот полный код для твоего 'примера'

#!/usr/bin/env python
#-*- coding: utf8 -*-

import sys
import os.path
import pickle
import string

def main(args):
    root_path = 'lib'

    with open('datafile.dat', 'rb') as fd:
        data = pickle.load(fd)

    for d in data:
        rel = os.path.relpath(d, root_path)
        rel_up = os.path.join(*map(string.upper, os.path.split(rel)))
        new_path = os.path.join(root_path, rel_up)
        print '{} => {}'.format(d, new_path)
        os.renames(d, new_path)

    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))

И все же прав тут только GateKeeper - ибо не ведаешь ты, что и зачем тебе нужно.

s0rg
()
Ответ на: комментарий от s0rg

все сделал, спасибо за помощь. вот этот пример работает алгоритм довольно просто - разбиваем пути, добавляем в сеты и потом так же работаем, обходим все в цикле и переименовываем

yanmhlv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.