os.path.join doubt
Thomas L. Shinnick
tshinnic at io.com
Thu Feb 3 18:57:33 EST 2011
At 05:33 PM 2/3/2011, Westley MartÃnez wrote:
>On Thu, 2011-02-03 at 23:11 +0000, Steven D'Aprano wrote:
>>On Thu, 03 Feb 2011 07:58:55 -0800, Ethan Furman wrote:
>> > Steven D'Aprano wrote:
>>[snip]
>>
>>Yes. Is there a problem? All those paths should be usable from Windows.
>>If you find it ugly to see paths with a mix of backslashes and forward
>>slashes, call os.path.normpath, or just do a simple string replace:
>>
>>path = path.replace('/', '\\')
>>
>>before displaying them to the user. Likewise if you have to pass the
>>paths to some application that doesn't understand slashes.
>>
>>
>>--
>>Steven
>Paths that mix /s and \s are NOT valid on
>Windows. In one of the setup.py scripts I wrote
>I had to write a function to collect the paths
>of data files for installation. On Windows it
>didn't work and it was driving me crazy. It
>wasn't until I realized os.path.join was joining
>the paths with \\ instead of / that I was able to fix it.
>
>def find_package_data(path):
> """Recursively collect EVERY file in path to a list."""
> oldcwd = os.getcwd()
> os.chdir(path)
> filelist = []
> for path, dirs, filenames in os.walk('.'):
> for name in filenames:
> filename = ((os.path.join(path, name)).replace('\\', '/'))
> filelist.append(filename.replace('./', 'data/'))
> os.chdir(oldcwd)
> return filelist
Please check out os.path.normpath() as suggested. Example:
>>> import os
>>> s = r"/hello\\there//yall\\foo.bar"
>>> s
'/hello\\\\there//yall\\\\foo.bar'
>>> v = os.path.normpath(s)
>>> v
'\\hello\\there\\yall\\foo.bar'
The idea behind os.path is to cater to the host
OS. Thus os.path.normpath() will convert to the
host's acceptable delimiters. That is, you
didn't need the .replace(), but rather to more
fully use the existing library to good advantage with .normpath().
However, note that delimiters becomes an issue
only when directly accessing the host OS, such as
when preparing command line calls or accessing
native APIs. Within the Python
library/environment, both '/' and '\' are
acceptable. External use is a different matter.
So, you need to be specific on how and where your
paths are to be used. For instance os.chdir()
will work fine with a mixture, but command line
apps or native APIs will probably fail.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20110203/176bcb63/attachment-0001.html>
More information about the Python-list
mailing list