2012-10-29 18 views
8

Tôi đang điền một hộp danh sách tkinter với các tệp từ một thư mục. Tên của tất cả các tệp bắt đầu bằng một số từ 01 - n. Khi tôi xem các tệp trong thư mục chúng xuất hiện theo thứ tự số. Tuy nhiên, khi tôi tải các tệp vào một hộp danh sách, chúng không được sắp xếp theo số lượng. Tôi có thể thay đổi những con số hàng đầu xung quanh, nhưng cùng một tệp sẽ luôn xuất hiện ở cùng một vị trí.Tệp từ thư mục được kéo theo thứ tự sai với python

Tôi chỉ sử dụng tên mục đơn giản để đơn giản hóa với ví dụ này. Nó vẫn cho thấy rằng chúng không được sắp xếp theo thứ tự bảng chữ cái hoặc số.

Danh sách này sẽ xuất hiện như sau trong listbox tôi

01. itemA 
02. itemB 
03. itemC 
04. itemD 

Nhưng nó xuất hiện như:

01. itemA 
04. itemD 
02. itemB 
03. itemC 

tôi có thể thay đổi số hàng đầu xung quanh, nhưng các tập tin sẽ luôn luôn cư trong cùng một thứ tự (theo tên, không phải số). Điều kỳ lạ là, nó thậm chí không phải thứ tự chữ cái.

Tôi đã sử dụng này

i = 0 
for filename in os.listdir(directory): 
     fileList.insert(i, filename) 
     i = i + 1 

Và đây

for filename in os.listdir(directory): 
     fileList.insert(END, filename) 

Cả hai kết quả trong điều tương tự.

+0

Tài liệu nói ["Danh sách theo thứ tự tùy ý."] (Http://docs.python.org/2/library/os.html#os.listdir)! Có lẽ đó là ngày sửa đổi? bạn đã đi sâu vào bất kỳ khả năng nào khác? –

+1

bạn có thể thử 'cho tên tệp trong sắp xếp (os.listdir (thư mục)):' http://docs.python.org/2/library/functions.html#sorted – FabienAndre

+0

@FabienAndre hoạt động hoàn hảo, nhờ – user1104854

Trả lời

17

os.listdir không đảm bảo bất kỳ thứ tự nào về nội dung của thư mục. Nếu bạn muốn các mục được sắp xếp, chỉ cần sắp xếp chúng bằng cách sử dụng chức năng được dựng sẵn sorted (với chức năng key thích hợp nếu cần).

+1

Thực tế, tài liệu trở lại bạn: ["Danh sách theo thứ tự tùy ý."] (http://docs.python.org/2/library/os.html#os.listdir) (!) –

+0

@hayden - Yeah. Có lẽ là * một số * phương pháp để điên rồ, nhưng nó có thể phụ thuộc vào hệ thống tập tin và vì vậy nó dễ dàng hơn cho các tài liệu để chỉ nói "tùy ý". Cảm ơn bạn đã đăng một liên kết mặc dù :) – mgilson

+0

Cảm ơn, đã làm việc một cách hoàn hảo. Có lý do nào khiến bạn muốn nó theo thứ tự tùy ý không? Tôi chỉ có thể nghĩ về nhiều trường hợp hơn khi bạn muốn nó được sắp xếp hơn là không. – user1104854

9

Hãy thử điều này.

for index, filename in enumerate(sorted(os.listdir(directory))): 
     print '{0:02d}. {1}'.format(index + 1, filename) 

Trong trường hợp số đó là một phần của tên tệp đi kèm với nhận xét của @ FabienAndre.

for filename in sorted(os.listdir(directory)): 
     print filename 
+1

Nó sẽ là 'str (index + 1) .zfill (2) + '. '+ filename' - Nhưng (từ giao diện của nó, 01. là một phần của tên tệp ...) – mgilson

+0

@mgilson, Sửa định dạng, tuy nhiên tôi không nghĩ rằng đó là một phần của tên tệp khi anh ấy có biến trong đoạn mã đầu tiên. – John

+0

Trong khi bạn đang sử dụng '.format', bạn cũng có thể đặt' '' 'và' filename' trong đó. ''{0: 02d}. Định dạng {1} '(chỉ số + 1, tên tệp) ' – mgilson

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