使用Python将文件对(.txt& .xml)移动到相应的文件夹中

时间:2017-09-07 21:39:20

标签: python file directory move shutil

我已经在这个挑战中工作了大约一天左右。我已经查看了SO上的多个问题和答案,并尝试了MacGyver'代码用于我的目的,但仍有问题。

我有一个目录(让我们称之为" src \"),包含数百个文件(.txt和.xml)。每个.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将每对文件移动到其各自的文件夹中。我已经尝试过使用我发现的代码(感谢11月12日Sethdd发布的帖子,但我很难弄清楚如何使用移动功能来获取文件对。 #39;我在哪里:

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

4 个答案:

答案 0 :(得分:0)

使用glob模块来整合所有' txt'文件。从那里你可以解析并创建文件夹并复制文件。

答案 1 :(得分:0)

这个过程应该像一样简单给你作为一个人。

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

你做了很多让你感到困惑的中间工作。

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

答案 2 :(得分:0)

你可以用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)
    )

答案 3 :(得分:0)

我的方法是:

      
  1. 找到我要移动的对(对没有对的文件不做任何处理)
  2.   
  3. 为每对创建一个目录
  4.   
  5. 将该对移动到目录
  6. #! /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)
    

    注意:当在具有对的目录内调用时,此脚本可以正常工作。