classification
Title: Behavior of os.path.join does not match documentation
Type: behavior Stage:
Components: Documentation, Library (Lib) Versions: Python 3.6, Python 3.4, Python 3.5, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: docs@python Nosy List: Michael Klatt, SilentGhost, docs@python
Priority: normal Keywords:

Created on 2018-05-04 18:39 by Michael Klatt, last changed 2018-05-05 23:58 by Michael Klatt.

Messages (3)
msg316184 - (view) Author: Michael Klatt (Michael Klatt) Date: 2018-05-04 18:39
The behavior of os.path.join() regarding path separators does not match the documentation. This affects Python 3.6, and goes back to at least Python 2.7.

From the documenation: 

"The return value is the concatenation of path and any members of *paths with exactly one directory separator (os.sep) following each non-empty part except the last, meaning that the result will only end in a separator if the last part is empty."

To me, this means that join will remove extraneous separators from the path, and that the only way to produce a trailing separator is to use join "" as the final path segment.

I expect `os.path.join("/abc//", "def/")` to produce the string "/abc/def" based on the documentation, but what it actually produces is "abc//def/".
msg316194 - (view) Author: SilentGhost (SilentGhost) * (Python triager) Date: 2018-05-05 04:12
your example actually produces '/abc//def/'.

However, I'm not sure where do you get the idea that it should clean up internal directory separators or do anything at all with the strings in paths. To me it reads like it's concatenating arguments skipping over the empty ones unless it's also the last one. 

In any case, what would you propose to fix the language to describe the behaviour more clear?
msg316223 - (view) Author: Michael Klatt (Michael Klatt) Date: 2018-05-05 23:58
For me, the ambiguity is due to the phrases "exactly one directory separator" and "the only way to produce a trailing separator".

I would suggest:

"The return value is the concatenation of path and any members of *paths so that there is a directory separator (os.sep) following each part except the last. An empty part is ignored unless it is the last part, in which case the result will end in a separator."

Or:

"The return value is the concatenation of path and any members of *paths such that there is guaranteed to be a directory separator (os.sep) following each part except the last. An empty part is ignored unless it is the last part, in which case the result will end in a separator."
History
Date User Action Args
2018-05-05 23:58:10Michael Klattsetmessages: + msg316223
2018-05-05 04:12:33SilentGhostsetnosy: + SilentGhost
messages: + msg316194
2018-05-04 18:39:06Michael Klattcreate