Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2010 11:20:46

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

Сначала сам вопрос:
Как наиболее элегантно имея полный путь к файлу, изменить имя самого файла.

Например, дана строка ‘/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?



Офлайн

#2 Авг. 4, 2010 11:43:08

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

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')



Офлайн

#3 Авг. 4, 2010 11:59:37

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

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[, ...]])



Офлайн

#4 Авг. 4, 2010 12:01:18

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  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)

Офлайн

#5 Авг. 4, 2010 14:35:33

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

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))
Это гораздо красивее, на мой взгляд. И… Это работает.



Офлайн

#6 Авг. 6, 2010 03:57:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

>>> s = "/home/vasya/test/test.txt"
>>> s = "/re_".join(s.rsplit('/', 1))
>>> s
'/home/vasya/test/re_test.txt'
>>>



Офлайн

#7 Авг. 6, 2010 04:14:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

>>> 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)

Офлайн

#8 Авг. 6, 2010 12:55:49

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

А если речь идёт о списке из ~ 10000 путей, то что отработает шустрее:

s = s.rsplit('/', 1)[0] + '/' + 're_' + s.rsplit('/', 1)[-1]
или
os.path.join(os.path.dirname(path), 're_'+os.path.basename(path))
?



Офлайн

#9 Авг. 6, 2010 14:10:52

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

нубский вопрос про имена файлов.

timeit тебе в помощь.
Но я бы десять раз подумал о том, стоит ли реально использовать первый вариант, не зависимо от скорости выполнения:
1. Знак ‘/’ может встречаться в имени файла (не на всех файловых системах, конечно);
2. Он куда менее правилен с точки зрения логичности и читаемости.

P.S. А затык скорее всего будет в скорости обращения к ФС.



Офлайн

#10 Авг. 7, 2010 08:03:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

нубский вопрос про имена файлов.

>>> def func(path, prefix="", sep='/'):
... return ("%s%s" % (sep, prefix)).join(path.rsplit(sep, 1))
а что такое dirname(), basename()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version