Python - Round Robin文件移动

时间:2016-11-08 13:04:12

标签: ruby python-3.x move shutil

我正在尝试创建一个Python脚本,将循环中的文件移动到其中包含最少文件的DIR中,以便将源DIR的文件均匀分配给两个目标DIR。

例如:

如果c:\ test包含:

test_1.txt test_2.txt test_3.txt test_4.txt

我希望将这些test_1.txt和test_3.txt移动到c:\ test \ dir_a,将test_2.txt和test_4.tx移动到c:\ test \ dir_b。

我已经能够在Ruby中成功地做到这一点,但是当我在脚本运行时尝试在Python中执行此操作时,它将所有文件移动到DIR中,其中包含最少量的文件,而不是将它们分发到循环赛。

这是我的Ruby示例:

require 'fileutils'

def check_file

watchfolder_1 = 'F:/Transcoder/testing/dir_a/'
watchfolder_2 = 'F:/Transcoder/testing/dir_b/'

if !Dir.glob('F:/Transcoder/testing/prep/*.txt').empty?

    Dir['F:/Transcoder/testing/prep/*.txt'].each do |f|

        node_1 = Dir["#{watchfolder_1}"+'*']
        node_2 = Dir["#{watchfolder_2}"+'*']

        nc_1 =  node_1.count
        nc_2 =  node_2.count

        loadmin =[nc_1,nc_2].min

        #puts loadmin

        if loadmin == nc_1

            FileUtils.mv Dir.glob("#{f}"), watchfolder_1

            puts "#{f} moved to DIR A"

        elsif loadmin == nc_2

            FileUtils.mv Dir.glob("#{f}"), watchfolder_2

            puts "#{f} moved to DIR B"

        end

        puts 'Files successfully moved to staging area.'

    end

    else
       puts 'No valid files found'
    end
end
check_file

这输出以下内容:

C:\Ruby22-x64\bin\ruby.exe -e  $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)
F:/ruby/transcode_engine/test.rb
F:/Transcoder/testing/prep/test_1.txt moved to DIR A
Files successfully moved to staging area.
F:/Transcoder/testing/prep/test_2.txt moved to DIR B
Files successfully moved to staging area.
F:/Transcoder/testing/prep/test_3.txt moved to DIR A
Files successfully moved to staging area.
F:/Transcoder/testing/prep/test_4.txt moved to DIR B
Files successfully moved to staging area.

文件按我希望的方式移动。

现在这是我的Python脚本:

import shutil
from glob import glob
import os.path


dir_a = os.listdir('F:\\Transcoder\\testing\\dir_a\\')
dir_b = os.listdir('F:\\Transcoder\\testing\\dir_b\\')
t_a = 'F:\\Transcoder\\testing\\dir_a\\'
t_b = 'F:\\Transcoder\\testing\\dir_b\\'


if os.listdir('F:\\Transcoder\\testing\\prep\\'):

    prep = glob('F:\\Transcoder\\testing\\prep\\*.txt')

    for file in prep:

        ac = len(dir_a)
        bc = len(dir_b)

        load = [ac, bc]

        if min(load) == ac:

            print('Moving' + file + 'to DIR A')
            shutil.move(file, t_a)

        elif min(load) == bc:

            print('Moving' + file + 'to DIR B')
            shutil.move(file, t_b)

else:
    print('No Files')

此脚本返回:

C:\Users\3A01\AppData\Local\Programs\Python\Python35-32\python.exe   
F:/Projects/python_transcoder/test_2.py
Moving F:\Transcoder\testing\prep\test_1.txt to DIR A
Moving F:\Transcoder\testing\prep\test_2.txt to DIR A
Moving F:\Transcoder\testing\prep\test_3.txt to DIR A
Moving F:\Transcoder\testing\prep\test_4.txt to DIR A

我在Python脚本出错的地方,为什么不循环移动文件?

1 个答案:

答案 0 :(得分:1)

dir_adir_b在脚本开头计算,因此即使您在循环中移动文件,加载也始终相同。

for循环中移动它:

dir_a = os.listdir(r'F:\Transcoder\testing\dir_a')
dir_b = os.listdir(r'F:\Transcoder\testing\dir_b')

狐狸提议(还有一些其他小修正,比如不重复路径和使用" raw"前缀(r"the\data")以避免逃避反叛。

import shutil
from glob import glob
import os.path


t_a = r'F:\Transcoder\testing\dir_a'
t_b = r'F:\Transcoder\testing\dir_b'

prep = glob('F:\\Transcoder\\testing\\prep\\*.txt')
if prep:        

    for file in prep:

        dir_a = os.listdir(t_a)
        dir_b = os.listdir(t_b)
        ac = len(dir_a)
        bc = len(dir_b)

        load = [ac, bc]

        if min(load) == ac:

            print('Moving' + file + 'to DIR A')
            shutil.move(file, t_a)

        else:

            print('Moving' + file + 'to DIR B')
            shutil.move(file, t_b)

else:
    print('No Files')