Message306304
While testing a module, I have found a weird behaviour of pathlib package. I have a list of pathlib.Paths and I sorted() it. I assumed that the order retrieved by sorting a list of Paths would be the same as the order retrieved by sorting the list of their corresponding (string) filenames. But it is not the case.
I run the following example:
==========================================================================
from pathlib import Path
# order string filenames
filenames_for_testing = (
'/spam/spams.txt',
'/spam/spam.txt',
'/spam/another.txt',
'/spam/binary.bin',
'/spam/spams/spam.ttt',
'/spam/spams/spam01.txt',
'/spam/spams/spam02.txt',
'/spam/spams/spam03.ppp',
'/spam/spams/spam04.doc',
)
sorted_filenames = sorted(filenames_for_testing)
# output ordered list of string filenames
print()
print("Ordered list of string filenames:")
print()
[print(f'\t{element}') for element in sorted_filenames]
print()
# order paths (build from same string filenames)
paths_for_testing = [
Path(filename)
for filename in filenames_for_testing
]
sorted_paths = sorted(paths_for_testing)
# outoput ordered list of pathlib.Paths
print()
print("Ordered list of pathlib.Paths:")
print()
[print(f'\t{element}') for element in sorted_paths]
print()
# compare
print()
if sorted_filenames == [str(path) for path in sorted_paths]:
print('Ordered lists of string filenames and pathlib.Paths are EQUAL.')
else:
print('Ordered lists of string filenames and pathlib.Paths are DIFFERENT.')
for element in range(0, len(sorted_filenames)):
if sorted_filenames[element] != str(sorted_paths[element]):
print()
print('First different element:')
print(f'\tElement #{element}')
print(f'\t{sorted_filenames[element]} != {sorted_paths[element]}')
break
print()
==========================================================================
The output of this script was:
==========================================================================
Ordered list of string filenames:
/spam/another.txt
/spam/binary.bin
/spam/spam.txt
/spam/spams.txt
/spam/spams/spam.ttt
/spam/spams/spam01.txt
/spam/spams/spam02.txt
/spam/spams/spam03.ppp
/spam/spams/spam04.doc
Ordered list of pathlib.Paths:
/spam/another.txt
/spam/binary.bin
/spam/spam.txt
/spam/spams/spam.ttt
/spam/spams/spam01.txt
/spam/spams/spam02.txt
/spam/spams/spam03.ppp
/spam/spams/spam04.doc
/spam/spams.txt
Ordered lists of string filenames and pathlib.Paths are DIFFERENT.
First different element:
Element #3
/spam/spams.txt != /spam/spams/spam.ttt
==========================================================================
As you can see, 'spam/spams.txt' goes in different places if you have sorted by pathlib.Paths than if you have sorted by string filenames.
I think that it is weird that sorting pathlib.Paths yields a different result than sorting their string filenames. I think that pathlib.Paths should be ordered by alphabetical order of their corresponding filenames.
Thank you. |
|
Date |
User |
Action |
Args |
2017-11-15 19:48:55 | QbLearningPython | set | recipients:
+ QbLearningPython |
2017-11-15 19:48:55 | QbLearningPython | set | messageid: <1510775335.55.0.213398074469.issue32040@psf.upfronthosting.co.za> |
2017-11-15 19:48:55 | QbLearningPython | link | issue32040 messages |
2017-11-15 19:48:55 | QbLearningPython | create | |
|