【问题标题】:Move pairs of files (.txt & .xml) into their corresponding folder using Python使用 Python 将文件对(.txt 和 .xml)移动到相应的文件夹中
【发布时间】:2017-09-07 21:39:19
【问题描述】:

我已经为这个挑战做了大约一天左右的时间。我查看了关于 SO 提出的多个问题和答案,并尝试“MacGyver”用于我的目的的代码,但仍然存在问题。

我有一个包含数百个文件(.txt 和 .xml)的目录(我们称之为“src\”)。每个 .txt 文件都有一个关联的 .xml 文件(我们称之为一对)。示例:

src\text-001.txt
src\text-001.xml
src\text-002.txt
src\text-002.xml
src\text-003.txt
src\text-003.xml

下面是一个示例,说明我希望如何将每对文件放入一个唯一的文件夹中:

src\text-001\text-001.txt
src\text-001\text-001.xml
src\text-002\text-002.txt
src\text-002\text-002.xml
src\text-003\text-003.txt
src\text-003\text-003.xml

我想做的是为每对文件创建一个关联的文件夹,然后使用 Python 将每对文件移动到其各自的文件夹中。我已经尝试使用我找到的代码工作(感谢 Sethdd 12 年 11 月的帖子,但我无法弄清楚如何使用移动功能来获取文件对。这是我所在的位置:

import os
import shutil

srcpath = "PATH_TO_SOURCE"
srcfiles = os.listdir(srcpath)

destpath = "PATH_TO_DEST"

# grabs the name of the file before extension and uses as the dest folder name
destdirs = list(set([filename[0:9] for filename in srcfiles]))


def create(dirname, destpath):
    full_path = os.path.join(destpath, dirname)
    os.mkdir(full_path)
    return full_path

def move(filename, dirpath):
    shutil.move(os.path.join(srcpath, filename)
                ,dirpath)

# create destination directories and store their names along with full paths
targets = [
    (folder, create(folder, destpath)) for folder in destdirs
]

for dirname, full_path in targets:
    for filename in srcfile:
        if dirname == filename[0:9]:
            move(filename, full_path)

我觉得这应该很简单,但 Python 不是我每天都在使用的东西,而且我已经有一段时间没有编写脚本了...任何帮助将不胜感激!

谢谢,

WK2EcoD

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。

标签: python file directory move shutil


【解决方案1】:

使用 glob 模块来交互所有的“txt”文件。从中您可以解析和创建文件夹并复制文件。

【讨论】:

    【解决方案2】:

    这个过程应该像它看起来对你作为一个人一样简单。

    for file_name in os.listdir(srcpath):
        dir = file_name[:9]
        # if dir doesn't exist, create it
        # move file_name to dir
    

    您正在做很多似乎让您感到困惑的中间工作。

    另外,插入一些简单的print语句来跟踪数据流和执行流。到目前为止,您似乎没有跟踪输出。

    【讨论】:

      【解决方案3】:

      你可以用 os 模块来做。对于目录中的每个文件,检查关联文件夹是否存在,如果需要,创建然后移动文件。请看下面的代码:

      import os
      
      SRC = 'path-to-src'
      
      for fname in os.listdir(SRC):
          filename, file_extension = os.path.splitext(fname)
          if file_extension not in ['xml', 'txt']:
              continue
          folder_path = os.path.join(SRC, filename)
          if not os.path.exists(folder_path):
              os.mkdir(folderpath)
          os.rename(
              os.path.join(SRC, fname),
              os.path.join(folder_path, fname)
          )
      

      【讨论】:

        【解决方案4】:

        我的做法是:

        1. 找到我要移动的对(没有对的文件不做任何事情)
        2. 为每一对创建一个目录
        3. 将这对移动到目录中
        #! /usr/bin/env python
        # -*- coding: utf-8 -*-
        
        import os, shutil
        import re
        
        def getPairs(files):
            pairs = []
            file_re = re.compile(r'^(.*)\.(.*)$')
        
            for f in files:
                match =  file_re.match(f)
        
                if match:
                    (name, ext) = match.groups()
        
                    if ext == 'txt'  and name + '.xml' in files:
                        pairs.append(name)
            return pairs
        
        def movePairsToDir(pairs):
        
            for name in pairs:
                os.mkdir(name)
                shutil.move(name+'.txt', name)
                shutil.move(name+'.xml', name)
        
        
        files = os.listdir()
        pairs = getPairs(files)
        
        movePairsToDir(pairs)
        

        注意:此脚本在包含对的目录中调用时有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-12
          • 1970-01-01
          • 2013-02-23
          • 2022-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多