Форум сайта python.su
0
Доброго времени суток!
Пишу скрипт, который сравнивает содержимое 2-х папок, и если в одной из них не хватает какого-то файла, то он должен туда скопироваться. Вот то, что у меня получилось:
import os import shutil PathToFirstFolder = r'C:\pyt' # Указываем путь к первой директории PathToSecondFolder = r'D:\pyt' # Указывем путь к второй директории FilesOnFirstFolder = [] # Список файлов в первой директории FilesOnSecondFolder = [] # Список файлов во второй директории ResultFilesOnFirstFolder = [] # Уникальные файлы в первой директории ResultFilesOnSecondFolder= [] # Уникальные файлы во второй директории #Формируем список файлов в первой директории #Проверяем существование директорий: #первой директории if os.path.exists(PathToFirstFolder) == False: print ("Путь к директории",PathToFirstFolder,"не найден, проверте правильность пути") #второй директории elif os.path.exists(PathToSecondFolder) == False: print ("Путь к директории",PathToSecondFolder,"не найден, проверте правильность пути") #Если директории существуют, то формируем списки файлов: else: #Сканируем содержимое первой директории, включая поддиректории for root, dirs, files in os.walk(PathToFirstFolder): for name in files: #Добавляем в список относительные пути к файлам первой директории FilesOnFirstFolder.append(os.path.join(root, name)[len(PathToFirstFolder):]) #Дублируем записи из списка файлов первой директории в список ункиальных файлов первой директории ResultFilesOnFirstFolder = FilesOnFirstFolder #Сканируем содержимое второй директории, включая поддиректории for root, dirs, files in os.walk(PathToSecondFolder): for name in files: #Добавляем в список относительные пути к файлам второй директории FilesOnSecondFolder.append(os.path.join(root, name)[len(PathToSecondFolder):]) #Дублируем записи из списка файлов второй директории в список уникальных файлов второй директории ResultFilesOnSecondFolder = FilesOnSecondFolder #Удаляем записи из списка уникальных файлов первой директории, которые есть в списке файлов второй директории #Проходим по списку файлов второй директории for i in FilesOnSecondFolder: #Если такая запись есть в списке уникальных файлов первой директории, то if i in ResultFilesOnFirstFolder: #Удаляем её из списка уникальных файлов первой директории ResultFilesOnFirstFolder.remove(i) #Удаляем записи из списка уникальных файлов второй директории, которые есть в списке файлов первой директории #Проходим по списку файлов первой директории for i in FilesOnFirstFolder: #Если такая запись есть в списке уникальных файлов второй директории, то if i in ResultFilesOnSecondFolder: #Удаляем её из списка уникальных файлов второй директории ResultFilesOnSecondFolder.remove(i) #Выводим на экран список уникальных файлов в первой директории print () print ('###############################################') print ('Список недостающих файлов в '+PathToSecondFolder+':') print () #Проходим по списку уникальных файлов первой директории for i in ResultFilesOnFirstFolder: print(PathToFirstFolder+i) print(PathToFirstFolder+i) #и копируем их во вторую директорию shutil.copy2(PathToFirstFolder+i,PathToSecondFolder+i)
C:\pyt\
|---folder1
| `---folder11
| `---text111.txt
`---folder2
`---folder21
`---text211.txt
D:\pyt\
`---folder1
`---folder11
Офлайн
221
не понимаю, если вы сами писали этот код - то в чем проблема? В нужном моменте проверяете существование директории и если она отсутствует, создаете иерархию папок с помощью os.mkdirs и копируете файл
Офлайн
253
:) приводимый код делает не то что вы заказывали, но может оно и к лучшему?
import subprocess as sp import os class newcwd: def __init__(self, nwd=None): self.oldcwd = os.getcwd() self.newcwd = nwd def __enter__(self): if self.newcwd: os.chdir(self.newcwd) return self.newcwd def __exit__(self, exc_type, exc_value, traceback): os.chdir(self.oldcwd) def idir(dr1,dr2): with newcwd(dr1): sp.check_call("git init") sp.check_call("git add .") sp.check_call("git commit -m 'v1'") sp.check_call("git remote add origin " + dr2) def pl(dr1): with newcwd(dr1): sp.check_call("git pull origin master") d1=os.path.abspath("d1") d2=os.path.abspath("d2") idir(d1,d2) idir(d2,d1) pl(d1) pl(d2)
Офлайн
0
JOHN_16
не понимаю, если вы сами писали этот код - то в чем проблема? В нужном моменте проверяете существование директории и если она отсутствует, создаете иерархию папок с помощью os.mkdirs и копируете файл
doza_andСпасибо за код, но как я понимаю, он рассчитан на роботу с репозиториями, а у меня цель именно синхронизировать содержимое двух папок, и ничего более. Насколько я понимаю данный код не подходит для данной цели, поправьте пожалуйста, если я не прав.приводимый код делает не то что вы заказывали, но может оно и к лучшему?
Офлайн
31
Найден на просторах инета…точно не припомню где
программа сканирует периодически одну директорию на наличие обновившихся или добавленых файлов и папок и пишет во вторую директорию, синхронизирует…черпайте там , может что и найдете для себя
в конфиге указываете директории…ну да разберетесь
Отредактировано sanodin (Дек. 31, 2013 14:41:35)
Прикреплённый файлы:
Synchronizator.zip (7,8 KБ)
Офлайн
253
GoDammeDДиректории приведенный код синхронизирует.
код не подходит для данной цели
Отредактировано doza_and (Дек. 31, 2013 15:06:02)
Офлайн
75
doza_and
а як git сохраняет файли ? мне кажется он все файлы целиком сохраняет, а не только дифы
Офлайн
253
SingularityАга. Жмет только зипом. Но можно сделать репозиторий без рабочей копии файлов. Не спорю несколько изощренный способ синхронизации.
он все файлы целиком сохраняет
Отредактировано doza_and (Дек. 31, 2013 15:08:55)
Офлайн
0
sanodin
Найден на просторах инета…точно не припомню гдепрограмма сканирует периодически одну директорию на наличие обновившихся или добавленых файлов и папок и пишет во вторую директорию, синхронизирует…черпайте там , может что и найдете для себяв конфиге указываете директории…ну да разберетесь

#Проходим по списку уникальных файлов первой директории for i in ResultFilesOnFirstFolder: print(PathToFirstFolder+i) print(PathToFirstFolder+i) #и копируем их во вторую директорию shutil.copy2(PathToFirstFolder+i,PathToSecondFolder+i)
#Проходим по списку уникальных файлов первой директории for i in ResultFilesOnFirstFolder: path = os.path.realpath(PathToSecondFolder+i) dir = os.path.split(path)[-2] if not os.path.exists(dir): os.makedirs(dir) #и копируем их во вторую директорию shutil.copy2(PathToFirstFolder+i,path)
Офлайн
253
GoDammeD
могут быть файлы абсолютно любых типов и размеров
Офлайн