I am relatively new to python. I am trying to copy a directory to another directory maintaining the structure.
I am using
shutil.copytree(src, dst, symlinks=False, ignore=None,
copy_function=copy2, ignore_dangling_symlinks=False)
I am trying to write a call back function for ignore.
My aim is to take a list of files in a list , and copy only those files,ignoring the rest. How do we pass a list into the call back function?
I wrote a simple call back function , but I get some error when I try to run the copyTree function
def abc(src,names):
print(src)
print(names)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
shutil.copytree('D:\Mytest','D:\PythonTestDest3',symlinks=False,ignore=abc)
File "C:\Python32\lib\shutil.py", line 204, in copytree
if name in ignored_names:
TypeError: argument of type 'NoneType' is not iterable
(docs)
Try an anonymous function (
lambda
) and a list comprehension:Note that the
lambda
function gets the basenames of the files and directories, not their full paths; kudos @jwhitlock's for the directory handling.The shutil module provides a
ignore_patterns
function.The module page shows a couple of examples as well.
The return of the ignore function needs to be a list of directories and files to ignore. You aren't returning anything, which returns
None
, so you are getting the errorTypeError: argument of type 'NoneType' is not iterable
.Here's an example that will copy the folder structure and the files listed in 'copy_these':
The ignore callback function should return a list of names relative to the 'src' directory that should not be copied.
Your example callback returns nothing (ie. None). Then copytree, expecting a list, tries to iterate over it. Since it can't, you get that exception.