Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
15e22e1c
Commit
15e22e1c
authored
Dec 05, 1997
by
Guido van Rossum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added doc strings and reindented according to new standard, without tabs.
parent
7f973288
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
223 additions
and
189 deletions
+223
-189
Lib/ntpath.py
Lib/ntpath.py
+223
-189
No files found.
Lib/ntpath.py
View file @
15e22e1c
# Module 'ntpath' -- common operations on DOS pathnames
# Module 'ntpath' -- common operations on WinNT/Win95 pathnames
"""Common pathname manipulations, WindowsNT/95 version.
Instead of importing this module
directly, import os and refer to this module as os.path.
"""
import
os
import
stat
...
...
@@ -10,9 +14,11 @@ import string
# (this is done by normpath).
_normtable
=
string
.
maketrans
(
string
.
uppercase
+
"
\
\
/"
,
string
.
lowercase
+
os
.
sep
*
2
)
string
.
lowercase
+
os
.
sep
*
2
)
def
normcase
(
s
):
"""Normalize case of pathname. Makes all characters lowercase and all
slashes into backslashes"""
return
string
.
translate
(
s
,
_normtable
)
...
...
@@ -23,31 +29,35 @@ def normcase(s):
# a slash or backslash.
def
isabs
(
s
):
s
=
splitdrive
(
s
)[
1
]
return
s
!=
''
and
s
[:
1
]
in
'/
\
\
'
"""Test whether a path is absolute"""
s
=
splitdrive
(
s
)[
1
]
return
s
!=
''
and
s
[:
1
]
in
'/
\
\
'
# Join two (or more) paths.
def
join
(
a
,
*
p
):
path
=
a
for
b
in
p
:
if
isabs
(
b
):
path
=
b
elif
path
==
''
or
path
[
-
1
:]
in
'/
\
\
'
:
path
=
path
+
b
else
:
path
=
path
+
os
.
sep
+
b
return
path
"""Join two or more pathname components, inserting "
\
\
" as needed"""
path
=
a
for
b
in
p
:
if
isabs
(
b
):
path
=
b
elif
path
==
''
or
path
[
-
1
:]
in
'/
\
\
'
:
path
=
path
+
b
else
:
path
=
path
+
os
.
sep
+
b
return
path
# Split a path in a drive specification (a drive letter followed by a
# colon) and the path specification.
# It is always true that drivespec + pathspec == p
def
splitdrive
(
p
):
if
p
[
1
:
2
]
==
':'
:
return
p
[
0
:
2
],
p
[
2
:]
return
''
,
p
"""Split a pathname into drive and path specifiers. Returns a 2-tuple
"(drive,path)"; either part may be empty"""
if
p
[
1
:
2
]
==
':'
:
return
p
[
0
:
2
],
p
[
2
:]
return
''
,
p
# Split a path in head (everything up to the last '/') and tail (the
...
...
@@ -57,25 +67,27 @@ def splitdrive(p):
# The resulting head won't end in '/' unless it is the root.
def
split
(
p
):
d
,
p
=
splitdrive
(
p
)
slashes
=
''
while
p
and
p
[
-
1
:]
in
'/
\
\
'
:
slashes
=
slashes
+
p
[
-
1
]
p
=
p
[:
-
1
]
if
p
==
''
:
p
=
p
+
slashes
head
,
tail
=
''
,
''
for
c
in
p
:
tail
=
tail
+
c
if
c
in
'/
\
\
'
:
head
,
tail
=
head
+
tail
,
''
slashes
=
''
while
head
and
head
[
-
1
:]
in
'/
\
\
'
:
slashes
=
slashes
+
head
[
-
1
]
head
=
head
[:
-
1
]
if
head
==
''
:
head
=
head
+
slashes
return
d
+
head
,
tail
"""Split a pathname. Returns tuple "(head, tail)" where "tail" is
everything after the final slash. Either part may be empty"""
d
,
p
=
splitdrive
(
p
)
slashes
=
''
while
p
and
p
[
-
1
:]
in
'/
\
\
'
:
slashes
=
slashes
+
p
[
-
1
]
p
=
p
[:
-
1
]
if
p
==
''
:
p
=
p
+
slashes
head
,
tail
=
''
,
''
for
c
in
p
:
tail
=
tail
+
c
if
c
in
'/
\
\
'
:
head
,
tail
=
head
+
tail
,
''
slashes
=
''
while
head
and
head
[
-
1
:]
in
'/
\
\
'
:
slashes
=
slashes
+
head
[
-
1
]
head
=
head
[:
-
1
]
if
head
==
''
:
head
=
head
+
slashes
return
d
+
head
,
tail
# Split a path in root and extension.
...
...
@@ -84,64 +96,71 @@ def split(p):
# It is always true that root + ext == p.
def
splitext
(
p
):
root
,
ext
=
''
,
''
for
c
in
p
:
if
c
in
[
'/'
,
'
\
\
'
]:
root
,
ext
=
root
+
ext
+
c
,
''
elif
c
==
'.'
:
if
ext
:
root
,
ext
=
root
+
ext
,
c
else
:
ext
=
c
elif
ext
:
ext
=
ext
+
c
else
:
root
=
root
+
c
return
root
,
ext
"""Split the extension from a pathname. Extension is everything from the
last dot to the end. Returns "(root, ext)", either part may be empty"""
root
,
ext
=
''
,
''
for
c
in
p
:
if
c
in
[
'/'
,
'
\
\
'
]:
root
,
ext
=
root
+
ext
+
c
,
''
elif
c
==
'.'
:
if
ext
:
root
,
ext
=
root
+
ext
,
c
else
:
ext
=
c
elif
ext
:
ext
=
ext
+
c
else
:
root
=
root
+
c
return
root
,
ext
# Return the tail (basename) part of a path.
def
basename
(
p
):
return
split
(
p
)[
1
]
"""Returns the final component of a pathname"""
return
split
(
p
)[
1
]
# Return the head (dirname) part of a path.
def
dirname
(
p
):
return
split
(
p
)[
0
]
"""Returns the directory component of a pathname"""
return
split
(
p
)[
0
]
# Return the longest prefix of all list elements.
def
commonprefix
(
m
):
if
not
m
:
return
''
prefix
=
m
[
0
]
for
item
in
m
:
for
i
in
range
(
len
(
prefix
)):
if
prefix
[:
i
+
1
]
<>
item
[:
i
+
1
]:
prefix
=
prefix
[:
i
]
if
i
==
0
:
return
''
break
return
prefix
"Given a list of pathnames, returns the longest common leading component"
if
not
m
:
return
''
prefix
=
m
[
0
]
for
item
in
m
:
for
i
in
range
(
len
(
prefix
)):
if
prefix
[:
i
+
1
]
<>
item
[:
i
+
1
]:
prefix
=
prefix
[:
i
]
if
i
==
0
:
return
''
break
return
prefix
# Is a path a symbolic link?
# This will always return false on systems where posix.lstat doesn't exist.
def
islink
(
path
):
return
0
"""Test for symbolic link. On WindowsNT/95 always returns false"""
return
0
# Does a path exist?
# This is false for dangling symbolic links.
def
exists
(
path
):
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
1
"""Test whether a path exists"""
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
1
# Is a path a dos directory?
...
...
@@ -149,11 +168,12 @@ def exists(path):
# for the same path.
def
isdir
(
path
):
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
stat
.
S_ISDIR
(
st
[
stat
.
ST_MODE
])
"""Test whether a path is a directory"""
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
stat
.
S_ISDIR
(
st
[
stat
.
ST_MODE
])
# Is a path a regular file?
...
...
@@ -161,19 +181,21 @@ def isdir(path):
# for the same path.
def
isfile
(
path
):
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
stat
.
S_ISREG
(
st
[
stat
.
ST_MODE
])
"""Test whether a path is a regular file"""
try
:
st
=
os
.
stat
(
path
)
except
os
.
error
:
return
0
return
stat
.
S_ISREG
(
st
[
stat
.
ST_MODE
])
# Are two filenames really pointing to the same file?
def
samefile
(
f1
,
f2
):
s1
=
os
.
stat
(
f1
)
s2
=
os
.
stat
(
f2
)
return
samestat
(
s1
,
s2
)
"""Test whether two pathnames reference the same actual file"""
s1
=
os
.
stat
(
f1
)
s2
=
os
.
stat
(
f2
)
return
samestat
(
s1
,
s2
)
# Are two open files really referencing the same file?
...
...
@@ -181,24 +203,28 @@ def samefile(f1, f2):
# XXX THIS IS BROKEN UNDER DOS! ST_INO seems to indicate number of reads?
def
sameopenfile
(
fp1
,
fp2
):
s1
=
os
.
fstat
(
fp1
.
fileno
())
s2
=
os
.
fstat
(
fp2
.
fileno
())
return
samestat
(
s1
,
s2
)
"""Test whether two open file objects reference the same file (may not
work correctly)"""
s1
=
os
.
fstat
(
fp1
.
fileno
())
s2
=
os
.
fstat
(
fp2
.
fileno
())
return
samestat
(
s1
,
s2
)
# Are two stat buffers (obtained from stat, fstat or lstat)
# describing the same file?
def
samestat
(
s1
,
s2
):
return
s1
[
stat
.
ST_INO
]
==
s2
[
stat
.
ST_INO
]
and
\
s1
[
stat
.
ST_DEV
]
==
s2
[
stat
.
ST_DEV
]
"""Test whether two stat buffers reference the same file"""
return
s1
[
stat
.
ST_INO
]
==
s2
[
stat
.
ST_INO
]
and
\
s1
[
stat
.
ST_DEV
]
==
s2
[
stat
.
ST_DEV
]
# Is a path a mount point?
# XXX This degenerates in: 'is this the root?' on DOS
def
ismount
(
path
):
return
isabs
(
splitdrive
(
path
)[
1
])
"""Test whether a path is a mount point"""
return
isabs
(
splitdrive
(
path
)[
1
])
# Directory tree walk.
...
...
@@ -210,17 +236,21 @@ def ismount(path):
# or to impose a different order of visiting.
def
walk
(
top
,
func
,
arg
):
try
:
names
=
os
.
listdir
(
top
)
except
os
.
error
:
return
func
(
arg
,
top
,
names
)
exceptions
=
(
'.'
,
'..'
)
for
name
in
names
:
if
name
not
in
exceptions
:
name
=
join
(
top
,
name
)
if
isdir
(
name
):
walk
(
name
,
func
,
arg
)
"""walk(top,func,args) calls func(arg, d, files) for each directory "d"
in the tree rooted at "top" (including "top" itself). "files" is a list
of all the files and subdirs in directory "d".
"""
try
:
names
=
os
.
listdir
(
top
)
except
os
.
error
:
return
func
(
arg
,
top
,
names
)
exceptions
=
(
'.'
,
'..'
)
for
name
in
names
:
if
name
not
in
exceptions
:
name
=
join
(
top
,
name
)
if
isdir
(
name
):
walk
(
name
,
func
,
arg
)
# Expand paths beginning with '~' or '~user'.
...
...
@@ -233,86 +263,90 @@ def walk(top, func, arg):
# variable expansion.)
def
expanduser
(
path
):
if
path
[:
1
]
<>
'~'
:
return
path
i
,
n
=
1
,
len
(
path
)
while
i
<
n
and
path
[
i
]
not
in
'/
\
\
'
:
i
=
i
+
1
if
i
==
1
:
if
os
.
environ
.
has_key
(
'HOME'
):
userhome
=
os
.
environ
[
'HOME'
]
elif
not
os
.
environ
.
has_key
(
'HOMEPATH'
):
return
path
else
:
try
:
drive
=
os
.
environ
[
'HOMEDRIVE'
]
except
KeyError
:
drive
=
''
userhome
=
join
(
drive
,
os
.
environ
[
'HOMEPATH'
])
else
:
return
path
return
userhome
+
path
[
i
:]
"""Expand ~ and ~user constructions. If user or $HOME is unknown,
do nothing"""
if
path
[:
1
]
<>
'~'
:
return
path
i
,
n
=
1
,
len
(
path
)
while
i
<
n
and
path
[
i
]
not
in
'/
\
\
'
:
i
=
i
+
1
if
i
==
1
:
if
os
.
environ
.
has_key
(
'HOME'
):
userhome
=
os
.
environ
[
'HOME'
]
elif
not
os
.
environ
.
has_key
(
'HOMEPATH'
):
return
path
else
:
try
:
drive
=
os
.
environ
[
'HOMEDRIVE'
]
except
KeyError
:
drive
=
''
userhome
=
join
(
drive
,
os
.
environ
[
'HOMEPATH'
])
else
:
return
path
return
userhome
+
path
[
i
:]
# Expand paths containing shell variable substitutions.
# The following rules apply:
#
- no expansion within single quotes
#
- no escape character, except for '$$' which is translated into '$'
#
- ${varname} is accepted.
#
- varnames can be made out of letters, digits and the character '_'
#
- no expansion within single quotes
#
- no escape character, except for '$$' which is translated into '$'
#
- ${varname} is accepted.
#
- varnames can be made out of letters, digits and the character '_'
# XXX With COMMAND.COM you can use any characters in a variable name,
# XXX except '^|<>='.
varchars
=
string
.
letters
+
string
.
digits
+
'_-'
def
expandvars
(
path
):
if
'$'
not
in
path
:
return
path
res
=
''
index
=
0
pathlen
=
len
(
path
)
while
index
<
pathlen
:
c
=
path
[
index
]
if
c
==
'
\
'
'
:
# no expansion within single quotes
path
=
path
[
index
+
1
:]
pathlen
=
len
(
path
)
try
:
index
=
string
.
index
(
path
,
'
\
'
'
)
res
=
res
+
'
\
'
'
+
path
[:
index
+
1
]
except
string
.
index_error
:
res
=
res
+
path
index
=
pathlen
-
1
elif
c
==
'$'
:
# variable or '$$'
if
path
[
index
+
1
:
index
+
2
]
==
'$'
:
res
=
res
+
c
index
=
index
+
1
elif
path
[
index
+
1
:
index
+
2
]
==
'{'
:
path
=
path
[
index
+
2
:]
pathlen
=
len
(
path
)
try
:
index
=
string
.
index
(
path
,
'}'
)
var
=
path
[:
index
]
if
os
.
environ
.
has_key
(
var
):
res
=
res
+
os
.
environ
[
var
]
except
string
.
index_error
:
res
=
res
+
path
index
=
pathlen
-
1
else
:
var
=
''
index
=
index
+
1
c
=
path
[
index
:
index
+
1
]
while
c
!=
''
and
c
in
varchars
:
var
=
var
+
c
index
=
index
+
1
c
=
path
[
index
:
index
+
1
]
if
os
.
environ
.
has_key
(
var
):
res
=
res
+
os
.
environ
[
var
]
if
c
!=
''
:
res
=
res
+
c
else
:
res
=
res
+
c
index
=
index
+
1
return
res
def
expandvars
(
path
):
"""Expand shell variables of form $var and ${var}. Unknown variables
are left unchanged"""
if
'$'
not
in
path
:
return
path
res
=
''
index
=
0
pathlen
=
len
(
path
)
while
index
<
pathlen
:
c
=
path
[
index
]
if
c
==
'
\
'
'
:
# no expansion within single quotes
path
=
path
[
index
+
1
:]
pathlen
=
len
(
path
)
try
:
index
=
string
.
index
(
path
,
'
\
'
'
)
res
=
res
+
'
\
'
'
+
path
[:
index
+
1
]
except
string
.
index_error
:
res
=
res
+
path
index
=
pathlen
-
1
elif
c
==
'$'
:
# variable or '$$'
if
path
[
index
+
1
:
index
+
2
]
==
'$'
:
res
=
res
+
c
index
=
index
+
1
elif
path
[
index
+
1
:
index
+
2
]
==
'{'
:
path
=
path
[
index
+
2
:]
pathlen
=
len
(
path
)
try
:
index
=
string
.
index
(
path
,
'}'
)
var
=
path
[:
index
]
if
os
.
environ
.
has_key
(
var
):
res
=
res
+
os
.
environ
[
var
]
except
string
.
index_error
:
res
=
res
+
path
index
=
pathlen
-
1
else
:
var
=
''
index
=
index
+
1
c
=
path
[
index
:
index
+
1
]
while
c
!=
''
and
c
in
varchars
:
var
=
var
+
c
index
=
index
+
1
c
=
path
[
index
:
index
+
1
]
if
os
.
environ
.
has_key
(
var
):
res
=
res
+
os
.
environ
[
var
]
if
c
!=
''
:
res
=
res
+
c
else
:
res
=
res
+
c
index
=
index
+
1
return
res
# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
...
...
@@ -320,25 +354,25 @@ def expandvars(path):
# but as this module is called "ntpath", that's obviously wrong!
def
normpath
(
path
):
path
=
normcase
(
path
)
prefix
,
path
=
splitdriv
e
(
path
)
while
path
[:
1
]
==
os
.
sep
:
prefix
=
prefix
+
os
.
sep
path
=
path
[
1
:]
comps
=
string
.
splitfields
(
path
,
os
.
sep
)
i
=
0
while
i
<
len
(
comps
):
if
comps
[
i
]
==
'.'
:
del
comps
[
i
]
elif
comps
[
i
]
==
'..'
and
i
>
0
and
\
comps
[
i
-
1
]
not
in
(
''
,
'..'
):
del
comps
[
i
-
1
:
i
+
1
]
i
=
i
-
1
elif
comps
[
i
]
==
''
and
i
>
0
and
comps
[
i
-
1
]
<>
''
:
del
comps
[
i
]
else
:
i
=
i
+
1
# If the path is now empty, substitute '.'
if
not
prefix
and
not
comps
:
comps
.
append
(
'.'
)
return
prefix
+
string
.
joinfields
(
comps
,
os
.
sep
)
"""Normalize path, eliminating double slashes, etc."""
path
=
normcas
e
(
path
)
prefix
,
path
=
splitdrive
(
path
)
while
path
[:
1
]
==
os
.
sep
:
prefix
=
prefix
+
os
.
sep
path
=
path
[
1
:]
comps
=
string
.
splitfields
(
path
,
os
.
sep
)
i
=
0
while
i
<
len
(
comps
)
:
if
comps
[
i
]
==
'.'
:
del
comps
[
i
]
elif
comps
[
i
]
==
'..'
and
i
>
0
and
comps
[
i
-
1
]
not
in
(
''
,
'..'
):
del
comps
[
i
-
1
:
i
+
1
]
i
=
i
-
1
elif
comps
[
i
]
==
''
and
i
>
0
and
comps
[
i
-
1
]
<>
''
:
del
comps
[
i
]
else
:
i
=
i
+
1
# If the path is now empty, substitute '.'
if
not
prefix
and
not
comps
:
comps
.
append
(
'.'
)
return
prefix
+
string
.
joinfields
(
comps
,
os
.
sep
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment