我有几个文件夹中的几个文件,如下所示:

dir
├── 0
│   ├── 103425.xml
│   ├── 105340.xml
│   ├── 109454.xml
│
│── 1247
│   └── doc.xml
├── 14568
│   └── doc.xml
├── 1659
│   └── doc.xml
├── 10450
│   └── doc.xml
├── 10351
│   └── doc.xml

如何将所有文档提取到单个文件夹中,并 for each 移动的文档添加文件夹名称:

new_dir
├── 0_103425.xml
├── 0_105340.xml
├── 0_109454.xml
├── 1247_doc.xml
├── 14568_doc.xml
├── 1659_doc.xml
├── 10450_doc.xml
├── 10351_doc.xml

我试图用以下方法提取它们:

import os

for path, subdirs, files in os.walk('../dir/'):
    for name in files:
        print(os.path.join(path, name))

UPDATE

此外,我还试图:

import os, shutil
from glob import glob

files = []
start_dir = os.getcwd()
pattern   = "*.xml"

for dir,_,_ in os.walk('../dir/'):
    files.extend(glob(os.path.join(dir,pattern))) 
for f in files:
    print(f)
    shutil.move(f, '../dir/')

上面给出了每个文件的路径.但是,我不明白如何重命名和移动它们:

---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
<ipython-input-50-229e4256f1f3> in <module>()
     10 for f in files:
     11     print(f)
---> 12     shutil.move(f, '../dir/')

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/shutil.py in move(src, dst, copy_function)
    540         real_dst = os.path.join(dst, _basename(src))
    541         if os.path.exists(real_dst):
--> 542             raise Error("Destination path '%s' already exists" % real_dst)
    543     try:
    544         os.rename(src, real_dst)

Error: Destination path '../data/230948.xml' already exists

上面的错误说明了我为什么要用文件夹重命名它.

推荐答案

这对你有什么作用?

import os
import pathlib

OLD_DIR = 'files'
NEW_DIR = 'new_dir'

p = pathlib.Path(OLD_DIR)
for f in p.glob('**/*.xml'):
    new_name = '{}_{}'.format(f.parent.name, f.name)
    f.rename(os.path.join(NEW_DIR, new_name))

如果您没有Python(3.5+)的现代版本,也可以使用glob、os和shutil:

import os
import glob
import shutil


for f in glob.glob('files/**/*.xml'):
    new_name = '{}_{}'.format(os.path.basename(os.path.dirname(f)), os.path.basename(f))
    shutil.move(f, os.path.join('new_dir', new_name))

Python-3.x相关问答推荐

Pandas 数据帧断言等同于NaN

如何获得大Pandas 的常见时间间隔

小部件padx和包方法ipadx有什么不同?

Django内置注销视图`不允许的方法(GET):/USERS/LOGOUT/`

如何从包含SPAN文本的标记中获取链接

添加任意数量的 pandas 数据框

Pandas 窗口聚合两个排序表

如何在pyspark的列中按连续1分组并保持具有特定大小的组

如何在数据['column']中的'string'等条件下应用pandas

使用 pandas 进行多类分类的总体准确度

请求:RecursionError:超出最大递归深度

运行 PyCharm 测试时如何解决django.core.exceptions.ImproperlyConfigured:找不到 GDAL 库?

PySpark python 问题:Py4JJavaError: An error occurred while calling o48.showString

为什么 virtualenv 会有效地禁用 Python 3 制表符补全?

pip install dryscrape 失败并显示错误:[Errno 2] 没有这样的文件或目录:'src/webkit_server'?

如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

AttributeError:系列对象没有属性iterrows

在 Python 3 中调用 super() 的 4 种方法中的哪一种?

0 是 0 == 0(#evaluates 为真?)

Python:如何在 Windows 资源管理器中打开文件夹(Python 3.6.2、Windows 10)