In win32 and linux platform, os modules has diffreent output order,is it a bug?

H

Honghe Wu

env: python 2.7.3

6 test files' name in a directory as below:
12ab Abc Eab a1bc acd bc

the following is test code:
for root, dirs, files in os.walk(os.getcwd()):
print files

the output in win32 platform is:
['12ab', 'a1bc', 'Abc', 'acd', 'bc', 'Eab']

but in linux is:
['Eab', 'acd', 'a1bc', '12ab', 'bc', 'Abc' ]

they are so different. a bug?
 
C

Chris Rebert

env: python 2.7.3

6 test files' name in a directory as below:
12ab Abc Eab a1bc acd bc

the following is test code:
for root, dirs, files in os.walk(os.getcwd()):
print files

the output in win32 platform is:
['12ab', 'a1bc', 'Abc', 'acd', 'bc', 'Eab']

but in linux is:
['Eab', 'acd', 'a1bc', '12ab', 'bc', 'Abc' ]

they are so different. a bug?

Nope. When os.walk() fetches a listing of the contents of a directory,
it internally uses os.listdir() (or a moral equivalent thereof). The
docs for os.listdir() state that "The [returned] list is in arbitrary
order.". The order is dependent on the OS and filesystem, and likely
also more obscure factors (e.g. the order in which the files were
created). The lack of any required ordering allows for improved I/O
performance in many/most cases.

Cheers,
Chris
 
B

Benjamin Kaplan

env: python 2.7.3

6 test files' name in a directory as below:
12ab Abc Eab a1bc acd bc

the following is test code:
for root, dirs, files in os.walk(os.getcwd()):
print files

the output in win32 platform is:
['12ab', 'a1bc', 'Abc', 'acd', 'bc', 'Eab']

but in linux is:
['Eab', 'acd', 'a1bc', '12ab', 'bc', 'Abc' ]

they are so different. a bug?
--

The function doesn't specify a particular order, just that it will
hand you a list of files. It grabs those from the underlying file
system. It looks like Windows sorts it alphabetically and Linux just
does whatever (maybe sorted by creation time?). I don't think it's a
bug. If the order matters to you, sort it yourself.
 
H

Honghe Wu

Thanks! Cause I need sorted returnd list, and the arbitrary list makes the
other procedure go wrong. Maybe the I/O speed is more important in other
cases.
env: python 2.7.3

6 test files' name in a directory as below:
12ab Abc Eab a1bc acd bc

the following is test code:
for root, dirs, files in os.walk(os.getcwd()):
print files

the output in win32 platform is:
['12ab', 'a1bc', 'Abc', 'acd', 'bc', 'Eab']

but in linux is:
['Eab', 'acd', 'a1bc', '12ab', 'bc', 'Abc' ]

they are so different. a bug?

Nope. When os.walk() fetches a listing of the contents of a directory,
it internally uses os.listdir() (or a moral equivalent thereof). The
docs for os.listdir() state that "The [returned] list is in arbitrary
order.". The order is dependent on the OS and filesystem, and likely
also more obscure factors (e.g. the order in which the files were
created). The lack of any required ordering allows for improved I/O
performance in many/most cases.

Cheers,
Chris
 
N

Nobody

Thanks! Cause I need sorted returnd list, and the arbitrary list makes the
other procedure go wrong. Maybe the I/O speed is more important in other
cases.

You can sort the lists of files and subdirectories with e.g.:

for root, dirs, files in os.walk(os.getcwd()):
dirs[:] = sorted(dirs)
files = sorted(files)
...

Note that modifying the directory list in-place will affect which
subdirectories are traversed and in what order.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top