Creating a function for a directory

Chris Angelico rosuav at gmail.com
Mon Nov 11 18:11:52 EST 2013


On Tue, Nov 12, 2013 at 9:51 AM, Rick Johnson
<rantingrickjohnson at gmail.com> wrote:
> On Monday, November 11, 2013 4:26:46 PM UTC-6, Matt wrote:
>
>> So I want to take the file, "desktop/test.txt" and write
>> it to "desktop/newfolder/test.txt". I tried the below
>> script, and it gave me: "IOError: [Errno 2] No such file
>> or directory: 'desktop/%s.txt'". Any suggestions would be
>> great.
>>
>> def firstdev(file):
>>       in_file = open("desktop/%s.txt") % file
>>       indata = in_file.read()
>>       out_file = open("desktop/newfolder/%s.txt", 'w') % file
>>       out_file.write(indata)
>>       out_file.close()
>>       in_file.close()
>> firstdev("test")
>
> 1. i believe win32 file paths require a qualifying volume
> letter.

They do not; omitting the drive letter makes the path relative to the
current drive (and since it doesn't start with a directory specifier,
the current directory).

> 2. Never, ever, *EVER* write data to disc before confirming
> the paths your passing are pointing to the location you
> intended to write the data. Use os.path.exists(path) to test
> your paths BEFORE trying to write data.

Why? Why, oh why? If there's a problem, it'll be signalled with an
exception. Testing that the path exists opens you up to race problems,
so you won't see anything now, but some day your code will be in a
concurrent situation and you'll get unexpected exceptions. Why not
just expect the exception?

> 3. Be sure your variables names are both "self documenting"
> and "non clobbering". psst: "file" is a builtin! Using
> "filename" would be a far wiser choice for a variable
> containing a filename. When i see "file", i think of a "file
> object"

This one's arguable. How often do you use the 'file' builtin? I've
worked with files in Python innumerable times, and I don't remember
the last time I used 'file'. Yes, avoid shadowing important builtins
like 'list' and 'int', but 'id' and 'file' aren't that big a deal.

> 4. When dealing with files you must be sure that exceptions
> are handled cleanly. You don't want open file objects
> floating aimlessly around in memory because your naive code
> blew chunks.

They won't float around forever. The garbage collector will get to
them. If you're advocating use of 'with', that's only going to be an
issue if the code's called in a loop AND if it throws before the
close() calls come through.

> 5. Remember, you cannot write a file into a directory that
> does not exist.

So? Exception thrown, traceback printed to console, process terminated
cleanly. I'm not seeing a problem here.

> 6 For OS compatibility always use os.path.join() to join
> path parts into a whole. This method will insert the proper
> separator for you depending on the OS.

Technically true. However, most modern OSes will accept a slash.
There'll be a few situations where that's not true, but the OP an
happily just use slashes for simplicity. Remember the zen:
Practicality beats purity.

ChrisA



More information about the Python-list mailing list