2013-05-21 3 views
3

Я хотел бы узнать, как изменить содержимое списка, в частности, имена файлов, которые были возвращены os.listdir().Разбиение списка на Python

Имена файлов состоят из нескольких дубликатов имен, за которыми следует символ подчеркивания, затем суффикс, а затем расширение файла. Я пытаюсь вырезать элементы в списке вниз только первую часть имени файла, перед '_', так:

apple_d.jpg 
apple_si.jpg 
apple_sg.jpg 

становится только одну запись в списке, 'apple'.

Я могу избавиться от дубликатов и повторной alphabetise с

list(sorted(set(t))) 

но избавившись от всего, от подчёркивания года оказывается сложнее. Я попытался сделать это через .rpartition("_")[0]. но это, по-видимому, не работает для списков. Так что мне интересно, как это сделать?

Редактировать: хорошо, не работает здесь. Все еще получаются дубликаты и не раскалываются.

objects = os.listdir(dir) 





    for object in objects: 
     sorted(set(object.split('_', 1)[0])) 
     cmds.menuItem(label = object, parent = "objectMenu") 

(Последняя команда - команда майя, которая заполняет меню опций). Очень устал, поэтому мне придется это сделать позже. Но большое спасибо за помощь на сегодняшний день. Конечно, скоро это получится.

+0

Я предполагаю, что вы не ищете 'os.path.commonprefix' ... но похоже, что он близок к тому, что вы хотите, поэтому я расскажу об этом здесь. – mgilson

+0

@mgilson: 'commonprefix' для * компонентов пути * (поэтому разделяется' os.sep'), а не имена файлов. –

+0

@MartijnPieters - Документы говорят, что он работает по-характеру. Я не вижу причин, по которым он не может работать для имен файлов. – mgilson

ответ

5

Использование str.split() или str.rsplit() с лимитом, а затем выбрать первый элемент:

filename.split('_', 1)[0] 

.rsplit('_', 1) разделится на последнем подчеркиванием, .split() на первом. Выберите тот, который лучше всего подходит вам.

Это дает вам все до первого или последнего подчеркивания для этого имени файла.

Используя это в комплекте понимания, с sorted() возвращает список из этого набора:

unique_prefixes = sorted({filename.split('_', 1)[0] for filename in os.listdir(somedir)}) 

Для Python 2.6 и более ранних версий, где вы еще не имеют синтаксис набор понимания, следующее выражение генератора с set() будет работать тоже:

unique_prefixes = sorted(set(filename.split('_', 1)[0] for filename in os.listdir(somedir))) 
+0

@mgilson: Распознавание множества немного более компактно, чем выражение 'set()' plus generator. –

+0

@mgilson: Понятие набора устраняет дубликаты. Понимание списков нет. – recursive

+0

О, хорошо. Сегодня я должен быть вне игры. удаление дубликатов ... спасибо. (Я теперь удалил свой глупый и неправильный комментарий выше). – mgilson

0

из моего понимания вопроса, вы пытались позвонить rpartition непосредственно в списке (возможно, как os.listdir('path').rparition('_')[0]). Я считаю, что использовать rpartition так, как вы планируете, вам нужно применить его к отдельным элементам списка. Список понимание является наиболее рекомендуемый способ сделать это:

file_prefixes = [f.rpartition('_')[0] for f in os.listdir('path')] 

Превращение его в набор понимания как Martijin Питерс предлагает исключит дубликаты:

file_prefixes = {f.rpartition('_')[0] for f in os.listdir('path')} 

Примечание: Это должно быть на самом деле эквивалентно Martijin Питерс 'ответ, просто используя rpartition, как упоминалось в вопросе, а не rsplit. (В основном сохраняет параметр 1.)

0

Это работало для меня guys-

labels = os.listdir(dir) 




labels_processed=[] 
for label in labels: 
    labels_processed.append(label.split('_')[0]) 



labprocessed = set(labels_processed) 



for finallab in labprocessed:   
    cmds.menuItem(label = finallab, parent = "objectMenu") 

Приветствия,

S Тозера

+0

Вы должны принять ваш ответ. – jpmc26

Смежные вопросы