【问题标题】:Moving a subfolder to a different parentfolder in python在python中将子文件夹移动到不同的父文件夹
【发布时间】:2015-10-23 22:03:17
【问题描述】:

嗨,经过 2 小时的谷歌搜索和搜索,我没有找到,也没有为以下设置构建一段简单的代码:

3 个文件夹,2 个文件:

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

将文件夹B的“未知”内容移动到文件夹A。

解决此问题的所有尝试要么被认为过于琐碎,要么被重定向到“查找shutil”。或者为具有不同需求的特定设置生成半页代码,使我悲惨的pythonskills无法开发出足够(优雅)的结果。

在 python 中,我有一个过程来识别文件夹 B 的存在,但它的内容是未知的并且对我来说是不同的。鉴于充分披露;这是我的 XY 问题:

#!/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”的简化和假设情况:)

-编辑-

因为文件夹 A 确实已经存在,并且与文件夹 B 具有相同(潜在的)层次结构。这就是为什么

shutil.rmtree('folderA')

不是一个选项; folderA 应该保持不变。

因此,具有讽刺意味的是,暂时删除文件夹 A 的内容以将文件夹 B 的内容放入其中,产生的问题与我试图解决的问题基本相同。

-edit2- 感谢您的努力,我不断得到:

SyntaxError: invalid syntax 

在

def mv(from_folder, to_folder)
                             ^

现在我为我的迟钝程度表示歉意,但我目前无法清楚地理解您如何设想您的解决方案;

所以在查找了 def mv(.. 函数后,我得出的结论是,您可能的意思是 from_folder 应该替换为包含 folderB 的字符串。

所以我尝试了 2 个选项:

  1. 您的原件
  2. 定义:

stringA='folderA', stringB=folderB

并在代码的前 3 行中将 from_folder 替换为 stringB 和 to_folder 替换为 stringA。

两者都产生相同的错误。

*注意 import os 和 import shutil 已经在活动 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)

但它拒绝打印第二个“到达”,或者换句话说,它没有定义

【问题讨论】:

    标签: python move subdirectory shutil


    【解决方案1】:
    import shutil
    
    shutil.copytree('folderB', 'folderA')
    

    在运行命令之前确保folderA 不存在。

    如果由于某种原因该文件夹已经存在并且您无法控制它,那就这样做

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

    【讨论】:

    • 感谢您的快速回复,这让我意识到我的问题在没有解决内在问题的情况下是可以回答的。
    【解决方案2】:

    感谢大家的帮助!我尝试了不同的方法;

    #!/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
    

    现在我要做的就是改进“文件夹 A”和文件夹 B 的识别程序,但这是另一回事 :) 谢谢大家,只要我的代表达到 15,您就会自动获得加薪 ;)

    【讨论】:

      【解决方案3】:

      试试这个

      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')
      

      【讨论】:

      • 感谢您的努力,我不断收到:SyntaxError: invalid syntax 在 def mv(from_folder, to_folder) ^ 现在我为我的迟钝程度表示歉意,但我目前缺乏理解你的清晰度设想您的解决方案;因此,在查找 def mv(.. 函数后,我得出的结论是,您可能意味着 from_folder 应该替换为包含 folderB 的字符串。所以我尝试了 2 个选项:-your original -defining stringA='folderA', stringB=folderB 并用 from_folder 替换stringB.. 两者产生相同
      • 该行末尾缺少冒号def mv(from_folder, to_folder):
      • 英雄,现在要重试,我没想到,不过应该有!
      • 我已经添加了冒号但是它不会打印第二个“到达”或者换句话说它不参与/之后 def mv(.. 在一个完全不相关的旁注中,我在一个kwrite 中的虚拟机,以及环境之间的复制粘贴以某种方式不断“弄乱”随机位置的缩进,例如在我在原始帖子中的第二个示例代码中,位于 def mv 下方。让我慢慢发疯:)跨度>
      猜你喜欢
      • 2021-08-02
      • 2021-03-04
      • 1970-01-01
      • 2018-10-16
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多