I have a text file containing the names of images to be copied from a source folder to a destination folder. The source folder contains several sub-folders as shown below. The images may come from any of these sub-folders.
animals (source folder)
|-cats_1
|-cats_2
|-tigers_1
|-lions_1
|-lions_2
Shown below is the Python code:
import os
import shutil
src = r'X:\animals' #source with multiple sub-folders
dest = r'X:\images\cat_family' #destination folder
with open('cat_fam.txt') as file: #text file containing the image names
for path, subdirs, files in os.walk(src):
for name in file:
file_name = name.strip()
filename = os.path.join(path, file_name)
shutil.copy2(filename, dest)
I encounter a file not found error as shown below:
File "C:\Users\AppData\Local\Temp\2/ipykernel_30556/2100413787.py", line 6, in <module>
shutil.copy2(filename, dest)
File "C:\Users\AppData\Local\Continuum\anaconda3\envs\tf2.7\lib\shutil.py", line 266, in copy2
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "C:\Users\AppData\Local\Continuum\anaconda3\envs\tf2.7\lib\shutil.py", line 120, in copyfile
with open(src, 'rb') as fsrc:
FileNotFoundError: [Errno 2] No such file or directory: 'X:\\animals\\lion_2345.jpg'
CodePudding user response:
One approach would be to build a dictionary out of the data returned from os.walk()
The dictionary will be keyed on filename (not the full path) and its value will be the directory where the file resides.
Then you can read the cat_fam.txt file and lookup in the dictionary to see where it exists (if it exists!)
from os.path import join
from os import walk
from shutil import copy2
src = r'X:\animals'
dest = r'X:\animals\cat_family'
db = dict()
for root, _, files in walk(src):
for file in files:
db[file] = root
with open('cat_fam.txt') as fam:
for cat in map(str.strip, fam):
fp = db.get(cat)
if fp is not None:
copy2(join(fp, cat), join(dest, cat))