On Dec 31, 1:04 pm, [EMAIL PROTECTED] wrote: > Hello, > > I am new to python and wanted to write something for myself where > after inputing two words it would search entire drive and when finding > both names in files name would either copy or move thoe files to a > specified directory. > > But couple of attempts did not work as desired this is one of them.
Care to provide some more details than "did not work as desired"? Do you think the problem is in the finding or in the copying? I've given some comments below, but you really need to think through what "as desired" means ... Suppose your search words are "foo" and "bar", that C:\files is an empty folder, and the following 3 files exist: C:\a\foobar.txt C:\b\foobar.txt C:\b\barfoo.txt What do you want to happen the first time you run the script? ... if you run it a second time? If it's your intention not to make a copy of C:\b\foobar.txt (because its "basename" is the same as that of C:\a \foobar.txt), consider the desirability of warning yourself when this situation happens. > Could someone help fix it or maybe give a better example. > > Thank you very much. > > import os, os.path, shutil > > path = r"c:\\" Leave out the "r"; you are getting TWO backslashes: >>> path = r"c:\\" >>> len(path) 4 >>>>>> import os >>> wkr = os.walk('rd:\\') >>> wkr.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration # Nothing inside your for statement would be executed >>> wkr = os.walk('d:\\') >>> wkr.next() ('d:\\', a list of folders, a list of files) > dest_file = 'C:\\files' Presumably that would be better named dest_dir ... > name_search = raw_input('Please enter name searchs : ').split() > dup = [] In the (unlikely) event that an in-memory structure with no knowledge of what happened on previous runs will do what you really want to do, then consider a set instead of a list. > > for root, dirs, files in os.walk(path): > for name in files: > file_name = os.path.join(root, name) > if (name_search[0] in file_name) and (name_search[1] > in file_name): > #if os.path.join(root, name) in dest_file: > if file_name in dup: What do you really intend to do here? dup contains the FULL PATH of each file that you have found; if you come across another instance of one of those, either os.walk is horribly broken or your filesystem has a loop in its directory structure. If you really mean "am I about to try to copy over the top of an existing file", attack the problem head-on: make the full path of the file you are about to try to create, and use os.path.exists on it. > break Why break? You also want to avoid trying to copy files in the backup ("dest_file") directory, perhaps including ones that you have just copied there. Try a simple test if root == dest_file: continue very early in your outer loop. It's probably a good idea to wrap os.path.abspath() around root and destfile. > else: > print "copied %s to %s" % (name, > dest_file) > shutil.copy(os.path.join(root, name), > dest_file) You may prefer the results of copy2 to those of copy. > dup.append(file_name) HTH, John -- http://mail.python.org/mailman/listinfo/python-list