Help please with code to find and move files.

inFocus at sl.com inFocus at sl.com
Sun Dec 30 23:58:17 EST 2007


On Sun, 30 Dec 2007 20:49:29 -0800 (PST), John Machin
<sjmachin at lexicon.net> wrote:

>On Dec 31, 2:44 pm, inFo... at sl.com wrote:
>> On Sun, 30 Dec 2007 19:29:38 -0800 (PST), John Machin
>>
>>
>>
>>
>>
>> <sjmac... at lexicon.net> wrote:
>> >On Dec 31, 1:04 pm, inFo... at sl.com 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
>>
>> John,
>>
>> What I was trying to do is find files that are scattered all over my
>> hard drive that contain similar two words in them like bar and foo
>> and move them to one desired location removing from where they were
>> originally.  The did not work as desired were attempts when it would
>> attempt to read and write to the same location.so i would get an error
>> saying that source and destination were  the same.- Hide quoted text -
>>
>> - Show quoted text -
>
>The script that you showed would not have found any files to move/
>copy, as "infixum" and I have pointed out.
>
>Imagine that you were trying to help someone with a Python problem ...
>would you not like them to tell you (with some precision) what they
>were trying to do, what was the script that they actually ran, what
>the precise result (including stack trace and error message if any)
>was? Or do you like playing guessing games?


I am sorry i thought I did say what I was tryng to do.



More information about the Python-list mailing list