Форум сайта python.su
0
Здравствуйте.
Возникли сложности в работе со списками.
Есть список папок,
copyFolder = ‘111’, ‘123’, ‘233’, ‘434’, ‘232’
которые нужно скопировать из нескольких директорий:
t1 = os.listdir('С:\test1\dir')
t2 = os.listdir('С:\test2\dir')
t3 = os.listdir('С:\test3\dir')
t4 = os.listdir('С:\test4\dir')
где в итоге мы получаем:
>>> t1 ['223', '232', '111', '555'] >>> t2 ['333', '444', '111'] >>>t3 ['434', '090'] >>>t4 [' 123'. '564', '667']
copyFolder = ['111', '123', '233', '434', '232'] # список папок которые нужно скопировать s = [] # список совпадений for x in copyFolder: for y in t1: if x == y: s.append(x) break
Отредактировано Patrik (Авг. 19, 2013 22:47:48)
Офлайн
47
set().union(t1, t2, t3, t4)
Офлайн
0
А смысл объединять список t1, t2, t3, t4? Они же разных папках лежат.
t1 = С:\test1\dir в ней папки 223, 232, 111, 555
t2 = С:\test2\dir в ней папки 333, 444, 111
t3 = С:\test3\dir в ней папки 434, 090
t4 = С:\test4\dir в ней папки 123, '564, 667
есть масив папок 111, 123, 233, 434, 232, если какое-то значение совпадает с папкой из t1-t4, то эта папка копируется.
К примеру папка 111 (папка дублируется), есть в t1 и в t2, то нужно скопировать ее из t1, т.е. С:\test1\dir\111
папка 123 есть только в t4, копируем ее из t4, т.е С:\test4\dir\123.
Офлайн
857
import os cfname = r'C:\test' name1 = r'С:\test1\dir' name2 = r'С:\test2\dir' name3 = r'С:\test3\dir' name4 = r'С:\test4\dir' t1 = os.listdir(name1) t2 = os.listdir(name2) t3 = os.listdir(name3) t4 = os.listdir(name4) copyFolder = set(['111', '123', '233', '434', '232']) dct = {name1: t1, name2: t2, name3: t3, name4: t4} while copyFolder: i = copyFolder.pop() for k, v in dct.items(): if i in v: srcpath = os.path.join(k, i) dstpath = os.path.join(cfname, i) print('copy', srcpath, 'to', dstpath) break assert not copyFolder
Отредактировано py.user.next (Авг. 20, 2013 05:25:10)
Офлайн
47
set().union(t1, t2, t3, t4) & set(copyFolder)
Офлайн
857
bismigalisset().union(t1, t2, t3, t4)
bismigalisэто всё не в темуset().union(t1, t2, t3, t4) & set(copyFolder)
Офлайн
6
find -type d /tmp/d
/tmp/d/test1
/tmp/d/test1/321
/tmp/d/test1/123
/tmp/d/test1/111
/tmp/d/test4
/tmp/d/test4/333
/tmp/d/test4/123
/tmp/d/test3
/tmp/d/test3/112
/tmp/d/test3/123
/tmp/d/test3/133
/tmp/d/test3/111
/tmp/d/test2
/tmp/d/test2/333
/tmp/d/test2/222
/tmp/d/test2/111
import os # z, d = {}, {} # for v in '/tmp/d/test1', '/tmp/d/test3', '/tmp/d/test2', '/tmp/d/test4': z[v] = os.listdir(v) # for k,v in z.items(): for n in v: d[n] = '%s/%s' % (k,n) # print d # for n in d.values(): print n
{'321': '/tmp/d/test1/321', '333': '/tmp/d/test4/333', '133': '/tmp/d/test3/133', '123': '/tmp/d/test4/123', '111': '/tmp/d/test1/111', '112': '/tmp/d/test3/112', '222': '/tmp/d/test2/222'}
/tmp/d/test1/321
/tmp/d/test4/333
/tmp/d/test3/133
/tmp/d/test4/123
/tmp/d/test1/111
/tmp/d/test3/112
/tmp/d/test2/222Офлайн
6
Однострочник:
import os print dict(sum([[(n,'/tmp/d/%s/%s'%(k,n)) for n in v] for k,v in {v:os.listdir('/tmp/d/'+v) for v in ('test1','test2','test3', 'test4')}.items()],[]))
Офлайн
47
py.user.next понял потом надо еще полные пути найти по имени. ну тогда не сет а дикт надо юзать,
где ключ - имя папки, значение - полный путь.
Отредактировано bismigalis (Авг. 20, 2013 12:01:45)
Офлайн
0
py.user.next спасибо, очень понятный пример, взял как основу.
wbt однострочник - взрыв мозга)). Буду сидеть разбирать его.
У тебя интересное решение
z, = {} # for v in '/tmp/d/test1', '/tmp/d/test3', '/tmp/d/test2', '/tmp/d/test4': z[v] = os.listdir(v)
Офлайн