Форум сайта python.su
0
Сначала сам вопрос:
Как наиболее элегантно имея полный путь к файлу, изменить имя самого файла.
Например, дана строка ‘/home/vasya/test/test.txt’, а нужно ‘/home/vasya/test/re_test.txt’
И ещё. Почему
os.path.join(os.path.split('/home/vasya/test/test.txt'))Офлайн
0
UsCr
Как наиболее элегантно имея полный путь к файлу, изменить имя самого файла.
Например, дана строка ‘/home/vasya/test/test.txt’, а нужно ‘/home/vasya/test/re_test.txt’
os.rename('/home/vasya/test/test.txt','/home/vasya/test/re_test.txt')Офлайн
0
UsCrПотому, что вы передаете только один аргумент, который является листом. А синтаксис, на самом деле, вот такой:
И ещё. Почему
Код:
os.path.join(os.path.split('/home/vasya/test/test.txt'))
Возвращает ('/home/vasya/test', ‘test.txt’), а не /home/vasya/test/test.txt?
os.path.join(path1[, path2[, ...]])
Офлайн
20
split возвращает кортеж, а join с ними не работает, так что мы превращаем кортеж с двумя элементами в два безымянных аргумента для вредного join'а. Звездой это делается.
>>> os.path.join(*os.path.split('/home/vasya/test/test.txt'))
Следующие строки эквивалентны предыдущей (для join'а):
>>> os.path.join(*('/home/vasya/test', ‘test.txt’))
>>> os.path.join('/home/vasya/test', ‘test.txt’)
А задача решается так:
>>> os.path.join(os.path.dirname('/home/vasya/test/test.txt'), ‘re_test.txt’)
..bw
Отредактировано (Авг. 4, 2010 12:03:19)
Офлайн
0
bwНет. я заранее не знаю какое имя файла получу. Мне нужно именно добавить “re_” в имя.
os.path.join(os.path.dirname('/home/vasya/test/test.txt'), ‘re_test.txt’)
os.path.join(os.path.split(path)[0] , "re_"+os.path.split(path)[1])
os.path.join(os.path.dirname(path), 're_'+os.path.basename(path))
Офлайн
857
>>> s = "/home/vasya/test/test.txt"
>>> s = "/re_".join(s.rsplit('/', 1))
>>> s
'/home/vasya/test/re_test.txt'
>>>
Офлайн
857
>>> s = "/home/vasya/test/test.txt"
>>> s = s.rsplit('/', 1)[0] + '/' + 're_' + s.rsplit('/', 1)[-1]
>>> s
'/home/vasya/test/re_test.txt'
>>>
Отредактировано (Авг. 6, 2010 04:15:30)
Офлайн
0
А если речь идёт о списке из ~ 10000 путей, то что отработает шустрее:
s = s.rsplit('/', 1)[0] + '/' + 're_' + s.rsplit('/', 1)[-1]os.path.join(os.path.dirname(path), 're_'+os.path.basename(path))
Офлайн
26
timeit тебе в помощь.
Но я бы десять раз подумал о том, стоит ли реально использовать первый вариант, не зависимо от скорости выполнения:
1. Знак ‘/’ может встречаться в имени файла (не на всех файловых системах, конечно);
2. Он куда менее правилен с точки зрения логичности и читаемости.
P.S. А затык скорее всего будет в скорости обращения к ФС.
Офлайн
857
>>> def func(path, prefix="", sep='/'):
... return ("%s%s" % (sep, prefix)).join(path.rsplit(sep, 1))
Офлайн