os.path.join doubt

Westley Martínez anikom15 at gmail.com
Fri Feb 4 01:10:19 CET 2011


On Thu, 2011-02-03 at 17:57 -0600, Thomas L. Shinnick wrote:

> 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.

The reason why I use replace instead of normpath is because I want it to
'/'s on ALL platforms. This is because distutils requires the use of
'/'s.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20110203/7c075739/attachment.html>


More information about the Python-list mailing list