Найти - Пользователи
Полная версия: нубский вопрос про имена файлов.
Начало » Python для новичков » нубский вопрос про имена файлов.
1 2
UsCr
Сначала сам вопрос:
Как наиболее элегантно имея полный путь к файлу, изменить имя самого файла.

Например, дана строка ‘/home/vasya/test/test.txt’, а нужно ‘/home/vasya/test/re_test.txt’


И ещё. Почему
os.path.join(os.path.split('/home/vasya/test/test.txt'))
Возвращает ('/home/vasya/test', ‘test.txt’), а не /home/vasya/test/test.txt?
Vader
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')
Vader
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[, ...]])
bw
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
UsCr
bw
os.path.join(os.path.dirname('/home/vasya/test/test.txt'), ‘re_test.txt’)
Нет. я заранее не знаю какое имя файла получу. Мне нужно именно добавить “re_” в имя.
Второй вопрос как раз и родился от того, что я пытался завести вот такую конструкцию:
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))
Это гораздо красивее, на мой взгляд. И… Это работает.
py.user.next
>>> s = "/home/vasya/test/test.txt"
>>> s = "/re_".join(s.rsplit('/', 1))
>>> s
'/home/vasya/test/re_test.txt'
>>>
py.user.next
>>> s = "/home/vasya/test/test.txt"
>>> s = s.rsplit('/', 1)[0] + '/' + 're_' + s.rsplit('/', 1)[-1]
>>> s
'/home/vasya/test/re_test.txt'
>>>
операция сложения сначала создаёт копию всей строки (наряду с первоначальной строкой занимает ещё столько же памяти)
UsCr
А если речь идёт о списке из ~ 10000 путей, то что отработает шустрее:
s = s.rsplit('/', 1)[0] + '/' + 're_' + s.rsplit('/', 1)[-1]
или
os.path.join(os.path.dirname(path), 're_'+os.path.basename(path))
?
ZZZ
timeit тебе в помощь.
Но я бы десять раз подумал о том, стоит ли реально использовать первый вариант, не зависимо от скорости выполнения:
1. Знак ‘/’ может встречаться в имени файла (не на всех файловых системах, конечно);
2. Он куда менее правилен с точки зрения логичности и читаемости.

P.S. А затык скорее всего будет в скорости обращения к ФС.
py.user.next
>>> def func(path, prefix="", sep='/'):
... return ("%s%s" % (sep, prefix)).join(path.rsplit(sep, 1))
а что такое dirname(), basename()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB