Найти - Пользователи
Полная версия: Копирование файлов и создание директорий
Начало » Python для новичков » Копирование файлов и создание директорий
1 2
GoDammeD
Доброго времени суток!
Пишу скрипт, который сравнивает содержимое 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

Файл “text111.txt” копируется без проблем, а вот файл “text211.txt” не копируется т.к. отсутствует директория “folder2” с поддиректорией “folder21” в папке “D:\pyt\”.
Вопрос: как при помощи скрипта проверить есть они или нету, и если нету, то определить их имя и создать в папке “D:\pyt\”?
JOHN_16
не понимаю, если вы сами писали этот код - то в чем проблема? В нужном моменте проверяете существование директории и если она отсутствует, создаете иерархию папок с помощью os.mkdirs и копируете файл
doza_and
:) приводимый код делает не то что вы заказывали, но может оно и к лучшему?
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)
GoDammeD
JOHN_16
не понимаю, если вы сами писали этот код - то в чем проблема? В нужном моменте проверяете существование директории и если она отсутствует, создаете иерархию папок с помощью os.mkdirs и копируете файл

Проблема в том, что я не знаю как извлекать названия директорий для их создания. Я конечно догадываюсь, что для этого можно распарсить строку, но честно говоря не хочется писать ещё один велосипед, и возможно уже есть какие-то готовые решения?

doza_and
приводимый код делает не то что вы заказывали, но может оно и к лучшему?
Спасибо за код, но как я понимаю, он рассчитан на роботу с репозиториями, а у меня цель именно синхронизировать содержимое двух папок, и ничего более. Насколько я понимаю данный код не подходит для данной цели, поправьте пожалуйста, если я не прав.
sanodin
Найден на просторах инета…точно не припомню где
программа сканирует периодически одну директорию на наличие обновившихся или добавленых файлов и папок и пишет во вторую директорию, синхронизирует…черпайте там , может что и найдете для себя
в конфиге указываете директории…ну да разберетесь
doza_and
GoDammeD
код не подходит для данной цели
Директории приведенный код синхронизирует.
Если вам требуется синхронизация директорий, то с большой вероятностью вам нужна и система контроля версий. Я просто намекнул как с ее помощью можно синхронизировать директории. Вы получите не только добавление файлов но и проверку их содержимого, контроль изменений, и много чего еще. А нужно оно вам или нет, это вам решать. Синхронизатор требует для работы дополнительное место на диске для хранения информации системы контроля версий. Поскольку он лезет внутрь файлов, то очевидно он будет и медленней чем просто копирование файлов.
Замечу что синхронизация папок это стандартная функция windows, ubuntu one, google disk и прочих средств.
Singularity
doza_and
а як git сохраняет файли ? мне кажется он все файлы целиком сохраняет, а не только дифы
doza_and
Singularity
он все файлы целиком сохраняет
Ага. Жмет только зипом. Но можно сделать репозиторий без рабочей копии файлов. Не спорю несколько изощренный способ синхронизации.
GoDammeD
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)

P.S. А репозитории к сожалению не подходят т.к. это не является системой контроля версии, и в этих директориях могут быть файлы абсолютно любых типов и размеров. Но все же спасибо за подсказку.
doza_and
GoDammeD
могут быть файлы абсолютно любых типов и размеров

Системы контроля версий могут контролировать файлы любого типа и размера. С новым Годом! успехов в использовании Питона.
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