2012-08-14 45 views
2

我想問如何有效地處理正確的順序(按字母順序和增加數量)的文件夾中的文件名的訪問。如何讀取文件夾中的文件名並按照字母順序和遞增次序訪問它們?

例如,我在一個文件夾中有以下文件:apple1.dat,apple2.dat,apple10.dat,banana1.dat,banana2.dat,banana10.dat。我想閱讀文件的內容,以便首先閱讀apple1.dat,最後閱讀banana10.dat。

謝謝。

這是我到目前爲止所做的。

from glob import glob 
files=glob('*.dat') 
for list in files 
# I read the files here in order 

但正如指出的那樣,apple10.dat到來之前apple2.dat

+2

如果你讓我們知道你已經嘗試了什麼,它會有幫助,所以我們可以避免在答案中討論。當你做了你所做的事情時,你遇到了什麼問題等。 – 2012-08-14 13:56:17

+2

請記住,通常排序的自然順序文件是使用ASCII值的字母,它們將放置'apple1.dat'後面的'apple10.dat',但_before_'apple2.dat'。 – 2012-08-14 13:57:39

+0

您複製了我的答案,但您忘記使用sorted()函數對文件列表進行排序 – juankysmith 2012-08-14 14:13:53

回答

6
from glob import glob 
import os 

files_list = glob(os.path.join(my_folder, '*.dat')) 
for a_file in sorted(files_list): 
    # do whatever with the file 
    # 'open' or 'with' statements depending on your python version 
2

試試這個。

import os 

def get_sorted_files(Directory) 
    filenamelist = [] 
    for root, dirs, files in os.walk(Directory): 
     for name in files: 
      fullname = os.path.join(root, name) 
      filenamelist.append(fullname) 
    return sorted(filenamelist) 
0

您必須首先將數字轉換爲int。要做很長的路要求將名稱分解爲字符串和數字,將數字轉換爲整數並進行排序。也許別人有更短或更有效的方法。

def split_in_two(str_in): 
     ## go from right to left until a letter is found 
     ## assume first letter of name is not a digit 
     for ctr in range(len(str_in)-1, 0, -1): 
      if not str_in[ctr].isdigit(): 
       return str_in[:ctr+1], str_in[ctr+1:] ## ctr+1 = first digit 
     ## default for no letters found 
     return str_in, "0" 

    files=['apple1.dat', 'apple2.dat', 'apple10.dat', 'apple11.dat', 
      'banana1.dat', 'banana10.dat', 'banana2.dat'] 
    print sorted(files) ## sorted as you say 

    sort_numbers = [] 
    for f in files: 
     ## split off '.dat. 
     no_ending = f[:-4] 
     str_1, str_2 = split_in_two(no_ending) 
     sort_numbers.append([str_1, int(str_2), ".dat"]) 
    sort_numbers.sort() 
    print sort_numbers 
相關問題