2013-08-16 38 views
42

Tôi lo ngại về thứ tự các tệp và thư mục được cung cấp bởi os.walk(). Nếu tôi có các thư mục này, 1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 31, 32, thứ tự của danh sách đầu ra là gì?os.walk lặp lại theo thứ tự nào?

Có phải nó được sắp xếp theo giá trị số không?

1 2 3 10 20 30 11 21 31 12 22 32 

Hoặc được sắp xếp theo giá trị ASCII, như được cung cấp bởi ls?

1 10 11 12 2 20 21 22 3 30 31 32 

Và, làm thế nào tôi có thể nhận được một đơn đặt hàng cụ thể?

+2

Tại sao không 'chạm' các tệp đó hoặc 'mkdir' những thư mục đó (bạn có thể thực hiện tất cả trên một dòng) và tìm hiểu? –

+0

FYI: Trên Linux/ext3, tính năng này hiện giống với 'ls -U'. – JonnyJD

Trả lời

57

os.walk sử dụng os.listdir. Đây là docstring cho os.listdir:

listdir (đường dẫn) -> list_of_strings

Return một danh sách có chứa tên của các mục trong thư mục.

path: path of directory to list 

Danh sách theo thứ tự tùy ý. Nó không bao gồm các mục nhập đặc biệt '.' và '..' ngay cả khi chúng xuất hiện trong thư mục.

(nhấn mạnh của tôi).

Tuy nhiên, bạn có thể sử dụng sort để đảm bảo đơn đặt hàng bạn muốn.

for root, dirs, files in os.walk(path): 
    for dirname in sorted(dirs): 
     print(dirname) 

(Lưu ý dirnames là chuỗi không ints, vì vậy sorted(dirs) loại chúng như dây -. Đó là mong muốn cho một lần

Như Alfe và Ciro Santilli chỉ ra, nếu bạn muốn các thư mục được recursed theo thứ tự sắp xếp, sau đó sửa đổi dirstại chỗ:

for root, dirs, files in os.walk(path): 
    dirs.sort() 
    for dirname in dirs: 
     print(os.path.join(root, dirname)) 

Bạn có thể kiểm tra điều này bản thân:

import os 

os.chdir('/tmp/tmp') 
for dirname in '1 10 11 12 2 20 21 22 3 30 31 32'.split(): 
    try: 
      os.makedirs(dirname) 
    except OSError: pass 


for root, dirs, files in os.walk('.'): 
    for dirname in sorted(dirs): 
     print(dirname) 

in

1 
10 
11 
12 
2 
20 
21 
22 
3 
30 
31 
32 

Nếu bạn muốn liệt kê chúng trong sử dụng trật tự số:

for dirname in sorted(dirs, key=int): 

Để sắp xếp chuỗi chữ và số, sử dụng natural sort.

+4

Lý do Python đi ra ngoài để tránh việc ghi lại bất kỳ thứ tự đáng tin cậy nào là nó sử dụng các chức năng khác nhau trên các nền tảng khác nhau ('FindNextFileW',' DosFindNext', 'readdir'), và các chức năng này được tự ghi lại cho hệ thống tập tin trên hầu hết các nền tảng, và các hệ thống tập tin nói chung hoặc không tài liệu một đơn đặt hàng hoặc cung cấp cho bạn một cái gì đó hoàn toàn vô dụng. – abarnert

+2

Tôi nghĩ rằng điều này không sắp xếp thứ bậc đa cấp vì 'sắp xếp' không đúng chỗ. Để làm điều đó, sử dụng 'sort' như được giải thích bởi Alfe. –

26

os.walk() sản lượng trong từng bước, những gì nó sẽ thực hiện trong các bước tiếp theo. Bạn có thể trong từng bước ảnh hưởng đến thứ tự của các bước tiếp theo bằng cách sắp xếp danh sách theo cách bạn muốn.Trích dẫn the 2.7 manual:

Khi topdown là True, người gọi có thể sửa đổi danh sách dirnames tại chỗ (có lẽ sử dụng del hoặc chuyển nhượng lát), và đi bộ() sẽ chỉ recurse vào thư mục con có tên ở lại dirnames; điều này có thể được sử dụng để prune tìm kiếm, áp đặt một trật tự cụ thể của quý khách đến thăm

Vì vậy, sắp xếp các dirNames sẽ ảnh hưởng đến trật tự, trong đó họ sẽ được viếng thăm:

for rootName, dirNames, fileNames in os.walk(path): 
    dirNames.sort() # you may want to use the args cmp, key and reverse here 

Sau này, dirNames đều được sắp xếp tại chỗ và các giá trị thu được tiếp theo của walk sẽ phù hợp.

Tất nhiên bạn cũng có thể sắp xếp danh sách fileNames nhưng điều đó sẽ không ảnh hưởng đến bất kỳ bước nào khác (vì tệp không có con cháu walk sẽ truy cập).

Và tất nhiên bạn có thể lặp qua các phiên bản được sắp xếp của các danh sách này vì câu trả lời của unutbu đề xuất, nhưng điều đó sẽ không ảnh hưởng đến tiến trình tiếp theo của chính số walk.

Thứ tự chưa sửa đổi của các giá trị không được xác định bởi os.walk, có nghĩa là nó sẽ là "bất kỳ" thứ tự nào. Bạn không nên dựa vào những gì bạn trải nghiệm ngày hôm nay. Nhưng trên thực tế nó có thể sẽ là những gì hệ thống tập tin cơ bản trả về. Trong một số hệ thống tập tin, nó sẽ được sắp xếp theo thứ tự bảng chữ cái.

11

Cách đơn giản nhất là sắp xếp giá trị trả lại của os.walk(), ví dụ: sử dụng:

for rootName, dirNames, fileNames in sorted(os.walk(path)): 
    #root, dirs and files are iterated in order... 
+0

Tôi không biết tại sao những người bỏ qua câu trả lời này, đó là giải pháp sạch và đơn giản nhất ... TY –

+0

Vì điều này [Sự suy giảm của SO] (http://techblog.bozho.net/i-stopped-contributing- để stackoverflow-nhưng-nó-không-declining /)? Nah ... có lẽ vì đó là câu trả lời duy nhất của tôi :-) Cảm ơn bạn đã bỏ phiếu! – vpuente

+0

thật đáng buồn điều này không làm việc cho tôi :( – Reiion

Các vấn đề liên quan