Найти - Пользователи
Полная версия: Списки
Начало » Python для новичков » Списки
1 2
Patrik
Здравствуйте.
Возникли сложности в работе со списками.

Есть список папок,
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
bismigalis
set().union(t1, t2, t3, t4)
Patrik
А смысл объединять список 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.




py.user.next
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
bismigalis
set().union(t1, t2, t3, t4) & set(copyFolder)
py.user.next
bismigalis
set().union(t1, t2, t3, t4)
bismigalis
set().union(t1, t2, t3, t4) & set(copyFolder)
это всё не в тему
ему нужно пути составлять, выбирая определённые папки, исключив повторное копирование
wbt
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

почему-то оно строчки склеивает, пришлось разбивать решётками
wbt
Однострочник:

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()],[]))
bismigalis
py.user.next понял потом надо еще полные пути найти по имени. ну тогда не сет а дикт надо юзать,
где ключ - имя папки, значение - полный путь.
Patrik
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)
чтобы не плодить кучу переменных, а сразу формировать словарь.
Ты считаешь, что лучше в начале исключить повторные папки, а потом сопоставлять его со списком папок которые требуется скопировать?

bismigalis я новичек, с питоном пока на ВЫ (. Не понял твою мысль.
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