os.path.join doubt
Westley MartÃnez
anikom15 at gmail.com
Thu Feb 3 19:10:19 EST 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-0001.html>
More information about the Python-list
mailing list