Shutil.move() - сообщение об ошибке, что целевой файл не существует

У меня есть следующий код для сортировки файлов CSV в структуру каталогов, аналогичную файлам WAV, из которых были созданы файлы CSV:

from __future__ import print_function

import os
import shutil

WAV_FILES_PATH = 'g:\\wav_files\\test007\\'
CSV_FILES_PATH = 'g:\\csv_files\\test007\\'

wav_files_path = os.walk(WAV_FILES_PATH)
csv_files_path = os.walk(CSV_FILES_PATH)

# I'm only interested in CSV files in the root for CSV_FILES_PATH
(csv_root, _, csv_files) = csv_files_path.next()

print('Running ...')
for root, subs, files in wav_files_path:
    for file_ in files:
        if file_.endswith('wav'):
            for csv_file in csv_files:
                if(file_.split('.')[0] in csv_file):
                    src = os.path.join(csv_root, csv_file)
                    dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, ''), csv_file)
                    print('Moving "%s" to "%s" ...' % (src, dst))
                    shutil.move(src, dst)

В WAV_FILES_PATH есть подпапки, содержащие файлы WAV, например.

g:\wav_files\test007\run001\
g:\wav_files\test007\run002\

Поскольку файлы CSV расположены неупорядоченно в g:\csv_files\test007, я хочу клонировать структуру каталогов и переместить файлы CSV в правильную папку. В конце концов, я хочу иметь, например. g:\csv_files\test007\run001\, чтобы содержать CSV, соответствующий файлам WAV вg:\wav_files\test007\run001\.

Проблема в том, что команда shutil.move() дает мне IOError [Errnor 2] жалобу на то, что ПУНКТ НАЗНАЧЕНИЯ не существует. Это меня смущает, так как у меня есть доступ для записи к месту назначения, а Shutil.move() утверждает, что целевые каталоги не должны существовать.

Я что-то упустил здесь?

Функции print() правильно распечатывают src и dst.

Это вывод ошибки:

[...]
C:\Python27\lib\shutil.pyc in copyfile(src, dst)
     80                 raise SpecialFileError("`%s` is a named pipe" % fn)
     81 
     82     with open(src, 'rb') as fsrc:
---> 83         with open(dst, 'wb') as fdst:
     84             copyfileobj(fsrc, fdst)

IOError: [Errno 2] No such file or directory: 'g:\\csv_files\\test007\\run001\\recording_at_20140920_083721.csv'

ИНФОРМАЦИЯ: я добавил часть, выдающую ошибку (блоки with), непосредственно в свой код, и она НЕ выдает ошибку. Теперь я сам копирую файлы и удаляю их после этого.

Похоже, это ошибка в том, как работает Shutil.move().


person Blutkoete    schedule 23.09.2014    source источник
comment
Shutil.move() утверждает, что целевые каталоги не должны существовать. Я не так прочитал документация. Он говорит, что каталог назначения не должен уже существовать, но я беру это на случай, если src является каталогом, а не файлом.   -  person    schedule 23.09.2014
comment
Я добавил if not os.path.exists(os.path.dirname(dst)): os.makedirs(os.path.dirname(dst)) перед командой shutil.move(), которая создает каталог в правильном месте, но shutil.move() по-прежнему не работает, утверждая, что пункт назначения не существует.   -  person Blutkoete    schedule 23.09.2014


Ответы (1)


Я немного изменил ваш код и думаю, что он дает ожидаемые результаты.

#dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, ''), csv_file)
dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, '')) # Modified

Я также добавил следующую логику enter code hereперед выполнением Shutil.move()

if not os.path.exists(dst):
    os.makedirs(dst)

Надеюсь, это также сработает для вас !!!

person panr    schedule 23.09.2014