2012-05-17 3 views
0

Я хочу скопировать несколько файлов в один каталог и скопировать и переименовать файл с шагом 500. Например, первые 500 файлов в C: \ Pics (со случайными исходными именами) будут переименованы в 500- 1000 и новый каталог, в который они помещены, называется 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 

ответ

2

os.listdir и glob.glob - аналогичные функции. Они оба возвращают списки файлов/dirs, поэтому они не принадлежат к одному циклу (по крайней мере, не так, как вы пытаетесь их использовать). Главное отличие заключается в том, что os.listdir просто берет каталог и возвращает в основном *.* из него (минус и ..), где, поскольку glob.glob ожидает «шаблон глобирования», который может содержать *?[] в формате с ограниченным регулярным выражением. Функция, о которой вы могли бы подумать здесь (вместо glob.glob), это fnmatch.fnmatch, которая применяет шаблон глобуса к одному имени файла.

os. listdir (path)

Верните список, содержащий имена записей в каталоге , заданный путем. Список находится в произвольном порядке. Он не включает специальные записи . ' и «..», даже если они присутствуют в каталоге .

Доступность: Unix, Windows.

Изменено в версии 2.3: В Windows NT/2k/XP и Unix, если путь является объектом Unicode, результатом будет список объектов Unicode. Неразрешимые имена файлов будут по-прежнему возвращаться в виде строки объектов.

глобальный. Глоб (путь к файлу)

Вернуть возможно пустой список имен путей, которые матч путь, который должен быть строкой, содержащей путь спецификации. pathname может быть либо абсолютным (например, /usr/src/Python-1.5/Makefile), либо относительным (например, ../../Tools/ / .gif), и может содержать подстановочные знаки в стиле оболочки. Разбитые символические ссылки включены в результаты (как в оболочке).

Извините, слишком ленив, чтобы на самом деле макетировать файлы и проверять это, но тогда я буду делать всю работу за вас. Но это должно работать (или быть штопором близко к тому, на что, как я думаю, вы стремитесь). ;)

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 
+0

Спасибо. Можете ли вы внести некоторые изменения в мой код? –

+0

+1, ваш более совершенен, удаляя мой, чтобы не загромождать вопрос. – Brady

+0

спасибо, что вы были очень полезны –

Смежные вопросы