0

我想在一个目录中复制多个文件,并以 500 为增量复制并重命名文件。例如,C:\Pics 中的前 500 个文件(原始名称随机)将重命名为 500-1000,并将它们放置在新目录中in 被称为 500……。文件 1000-1500 将进入目录 1000,依此类推。

当前代码不会重命名放置的文件,而是将其放入具有正确编号的新目录中。这只是一个开始。我相信下面的代码是一个好的开始,任何人都可以帮助我修改以获得所需的结果吗?

import os, glob

target = 'C:\Pics'
prefix = 'p0'        
os.chdir(target)
allfiles = os.listdir(target)        
count = 500
for filename in allfiles:
    if not glob.glob('*.jpg'): continue
    dirname = prefix + str(count)
    target = os.path.join(dirname, filename)
    os.renames(filename, target)
    count +=1
4

1 回答 1

2

os.listdir 和 glob.glob 是类似的功能。它们都返回文件/目录列表,因此它们不属于同一个循环(至少不是您尝试使用它们的方式)。主要区别在于 os.listdir 只接受一个目录并基本上*.*从它返回(减去 . 和 ..),其中 glob.glob 需要一个“通配模式”,它可以包含* ? []在受限制的正则表达式格式中。您可能在这里想到的函数(而不是 glob.glob)是 fnmatch.fnmatch,它将通配模式应用于单个文件名。

操作系统。列表目录(路径)

返回一个列表,其中包含路径给定的目录中条目的名称。该列表是任意顺序的。它不包括特殊条目“。” 和 '..' 即使它们存在于目录中。

可用性:Unix、Windows。

在 2.3 版更改: 在 Windows NT/2k/XP 和 Unix 上,如果 path 是 Unicode 对象,则结果 > 将是 Unicode 对象列表。无法解码的文件名仍将作为字符串对象返回。

全球。glob(路径名)

返回与路径名匹配的可能为空的路径名列表,该路径名必须是包含路径规范的字符串。路径名可以是绝对的(如 /usr/src/Python-1.5/Makefile)或相对的(如 ../../Tools/ / .gif),并且可以包含 shell 样式的通配符。结果中包含损坏的符号链接(如在 shell 中)。

抱歉,懒得实际模拟文件并测试它,但我会为你做所有的工作。但这应该可行(或者与我认为您的目标非常接近)。;)

import os
import fnmatch
import os.path

target = 'C:\Pics'
os.chdir(target)
allfiles = os.listdir(target)
count = 500
for filename in allfiles:
    if not fnmatch.fnmatch(filename, '*.jpg'):
        continue
    if count % 500 == 0:
        dirname = 'p%04d' % count
        if not os.path.exists(dirname):
            os.mkdir(dirname)
    target = os.path.join(dirname, '%d.jpg' % count)
    os.rename(filename, target)
    count += 1
于 2012-05-17T16:50:13.613 回答