2015-10-23 3 views
0

Привета Через 2 часа прибегая к помощи и поиску я не в состоянии найти или создать простой кусок кода для следующей установки:Перемещение вложенного в другую parentfolder в питоне

3 папки, 2 файла:

/home/folderA/text2.txt 
/home/folderB/ 
/home/folderB/folder1 
/home/folderB/text1.txt 

Перемещение «Неизвестного» содержимого папки B в папкуA.

Все попытки решить эту проблему либо считаются слишком тривиальными, но и перенаправлены на «поиск позади». или получить половину страницы кода для конкретной установки с различными требованиями, что делает невозможным для моего жалкого pythonskills разработать достаточный (элегантный) результат.

В python У меня есть процедура определения существования папки B, но ее содержимое неизвестно и меняется для меня. В свете полного раскрытия; вот мой XYproblem:

#!/usr/bin/python 
from glob import glob 
path1 =glob('*') 
path2 = glob('*/*/') 
print path1 
print path2 
print len(path2) 
a = len(path2) 

for i in range(0,a): 
    print len(path2[i]), path2[i], path2[i][len(path2[i])-2] 
    print(path2[i][len(path2[i])-2].isdigit()) 
    if path2[i][len(path2[i])-3]==" " and path2[i][len(path2[i])-2].isdigit(): 
    print('yay') 
    newpath =path2[i][:len(path2[i])-2]+"0"+path2[i][(len(path2[i])-2):] 
    print(newpath) 
    import os 
    print(os.path.isdir(newpath)) 
    if os.path.isdir(newpath): #if it is true, the new folder with the " 0n" already exists 
     import shutil 
     newpath0=path2[i]+ '*/' 
     print(newpath0, "headsup", newpath) 
     shutil.copy(newpath0,newpath) 
    #shutil.move(

Но ради тех, кто ищет эффективное, простое решение этой проблемы, пожалуйста, держать его в упрощенном и гипотетический случай «folderX» :)

-Edit -

Поскольку папка A действительно уже существует и имеет ту же (потенциальную) иерархию, что и folderB. Вот почему

shutil.rmtree('folderA') 

не является вариантом; folderA должен оставаться неповрежденным.

Итак, по иронии судьбы, временно удалив содержимое папки A, чтобы вставить в него содержимое папки B, по существу, та же проблема, что и я пытаюсь решить.

-edit2- Спасибо за усилия, я продолжаю получать:

SyntaxError: invalid syntax 

на

def mv(from_folder, to_folder) 
          ^

Теперь я извинить за мой исключительный уровень retardedness, но я в настоящее время не хватает ясности в понять, как вы предполагали свое решение;

Таким образом, после глядя ДЕФ мв (.. функция я пришел к выводу, что вы могли бы означать, что from_folder следует заменить строку, которая содержит folderB

Так что я попытался 2 варианта:.

  1. оригинал
  2. Определение:

stringA='folderA', stringB=folderB

и заменяя from_folder на stringB и to_folder с stringA в первых трех строках вашего кода.

Оба имеют ту же ошибку.

* Замечание import os и import shutil уже выполнены в цикле active if. Просто чтобы убедиться, что был не вызывает проблем, я также попробовал с данной явной зева и импорта импорта shutil немедленно выше опр ..

код, который я до сих пор есть, следовательно, выглядит следующим образом:

#!/usr/bin/python 
from glob import glob 
path1 =glob('*') 
path2 = glob('*/*/') 
#print path1 
#print path2 
#print len(path2) 
a = len(path2) 

for i in range(0,a): 
    #print len(path2[i]), path2[i], path2[i][len(path2[i])-2] 
    #print(path2[i][len(path2[i])-2].isdigit()) 
    if path2[i][len(path2[i])-3]==" " and path2[i][len(path2[i])-2].isdigit(): 
    #print('yay') 
    newpath =path2[i][:len(path2[i])-2]+"0"+path2[i][(len(path2[i])-2):] 
    #print(newpath) 
    import os 
    #print(os.path.isdir(newpath)) 
    if os.path.isdir(newpath): #if it is true, the new folder with the " 0n" already exists 
     import shutil 
     newpath0=path2[i]+ '*/' 
     #print(newpath0, "hier", newpath, ' en path2[i] ', path2[i]) 
     #shutil.copy(newpath0,newpath) 
     #from here chose from_folder = path2[i] and to_folder=newpath 
     stringb = path2[i] 
     stringa = newpath 
     print(stringb,' ', stringa) 
     print('reached') 
     def mv(stringb, stringa): 
    root_src_dir = stringb 
    print('reached') 
     root_dst_dir = stringa 

    for src_dir, dirs, files in os.walk(root_src_dir): 
     dst_dir = src_dir.replace(root_src_dir, root_dst_dir) 
     if not os.path.exists(dst_dir): 
     os.mkdir(dst_dir) 
     for file_ in files: 
     src_file = os.path.join(src_dir, file_) 
     dst_file = os.path.join(dst_dir, file_) 
     if os.path.exists(dst_file): 
      os.remove(dst_file) 
     shutil.move(src_file, dst_dir) 

Но он отказывается печатать второй «достиг», или, другими словами, он не определяет

ответ

0
import shutil 

shutil.copytree('folderB', 'folderA') 

Просто убедитесь, что folderA не существует перед запуском команды.

Если по какой-то причине папка уже существует заранее, и вы не имеете никакого контроля над тем, что, просто сделать

shutil.rmtree('folderA') 
shutil.copytree('folderB', 'folderA') 
+0

Спасибо за ваш быстрый ответ, это заставило меня понять, что мой вопрос был подотчетен без решения неотъемлемой проблемы. –

0

Попробуйте это

import os 
import shutil 

def mv(from_folder, to_folder): 
    root_src_dir = from_folder 
    root_dst_dir = to_folder 

    for src_dir, dirs, files in os.walk(root_src_dir): 
     dst_dir = src_dir.replace(root_src_dir, root_dst_dir) 
     if not os.path.exists(dst_dir): 
      os.mkdir(dst_dir) 
     for file_ in files: 
      src_file = os.path.join(src_dir, file_) 
      dst_file = os.path.join(dst_dir, file_) 
      if os.path.exists(dst_file): 
       os.remove(dst_file) 
      shutil.move(src_file, dst_dir) 

Тогда

>>>mv('path/to/folderB', 'path/to/folderA') 
+0

Спасибо за усилия, я продолжаю получать: 'SyntaxError: недопустимый syntax' на Защиту мв (from_folder, to_folder) ^ Теперь я извинить за мой исключительный уровень retardedness, но я в настоящее время не хватает ясности в понять, как вы предполагали свое решение; Таким образом, после глядя ДЕФ мв (.. функция я пришел к выводу, что вы могли бы означать, что from_folder следует заменить строку, которая содержит folderB Так что я попытался 2 варианта:. -Ваш оригинальный -defining ' stringA = 'folderA', stringB = folderB' и подставляя из_папки в строку B .. Обе дают одинаковые –

+0

В конце этой строки отсутствует def def (из папки, to_folder): ' – saulspatz

+0

Герой, собирающийся повторить попытку, Мне не приходило в голову, хотя бы! –

0

Спасибо за все помощь! Я пробовал другой подход;

#!/usr/bin/python 
from glob import glob 
path1 =glob('*') 
path2 = glob('*/*/') 
print path1 
print('hi') 
#print path2 
#print len(path2) 
a = len(path2) 

for i in range(0,a): 
    #print len(path2[i]), path2[i], path2[i][len(path2[i])-2] 
    #print(path2[i][len(path2[i])-2].isdigit()) 
    if path2[i][len(path2[i])-3]==" " and path2[i][len(path2[i])-2].isdigit(): 
    #print('yay') 
    newpath =path2[i][:len(path2[i])-2]+"0"+path2[i][(len(path2[i])-2):] 
    #print(newpath) 
    import os 
    #print(os.path.isdir(newpath)) 
    if os.path.isdir(newpath): #if it is true, the new folder with the " 0n" already exists 
     import shutil 
     newpath0=path2[i]+ '*/' 
     #print(newpath0, "hi", newpath, ' en path2[i] ', path2[i]) 
     #shutil.copy(newpath0,newpath) 
     #from here chose from_folder = path2[i] and to_folder=newpath 
     #stringb = path2[i] 
     #stringa = newpath 
     #print(stringb,' ', stringa) 
     print('reached') 
     subb = os.listdir(path2[i]) #subb is defined here as a list of all the subfolders and subfiles in folderB 
     #print(subb,len(subb)) 
     print(newpath) #newpath = folderA 

     for c in range(0,(len(subb))): #This creates an index running for running through all the entries in subb 
    completesubb=range(len(subb)) #This line defines an array which will contain the full path to all the subfolders and subfiles within folderB 
    completesubb[c] = path2[i]+subb[c]#here the full path to the subfolders and subfiles within folderB is created,(with 1 sub-file/folder per entry in the array) 
    print completesubb[c] 
    completesuba=range(len(subb)) #This will not be required 
    #move_file(completesubb[c],newpath) #gave an error 
    shutil.move(completesubb[c],newpath) #moves everythin inside folderB to inside folderA 

Теперь все, что осталось для меня сделать, это улучшить распознающий процедуру «folderA» и folderB, но это уже совсем другая история :) Thnx все, как только моя репутация достигнет 15 вы получите автоматизированный рейз ;)

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

  • Нет связанных вопросов^_^