복붙노트

[PYTHON] 디렉토리의 파일 이름을 오름차순으로 정렬 [duplicate]

PYTHON

디렉토리의 파일 이름을 오름차순으로 정렬 [duplicate]

나는 jpgs와 다른 파일들로 된 디렉토리를 가지고있다. jpgs는 모두 파일명이 들어있다. 일부 파일 이름에 추가 문자열이있을 수 있습니다.

예를 들어.

01.jpg

또는 그것이 될 수있다.

Picture 03.jpg

파이썬에서는 모든 jpg 목록을 오름차순으로 필요로합니다. 이 코드 스 니펫은 다음과 같습니다.

import os
import numpy as np

myimages = [] #list of image filenames
dirFiles = os.listdir('.') #list of directory files
dirFiles.sort() #good initial sort but doesnt sort numerically very well
sorted(dirFiles) #sort numerically in ascending order

for files in dirFiles: #filter out all non jpgs
    if '.jpg' in files:
        myimages.append(files)
print len(myimages)
print myimages

내가 얻는 것은 이것이다.

['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg',
 '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg',
 '21.jpg', '22.jpg', '23.jpg', '24.jpg', '25.jpg', '26.jpg', '27.jpg',
 '28.jpg', '29.jpg', '3.jpg', '30.jpg', '31.jpg', '32.jpg', '33.jpg',
 '34.jpg', '35.jpg', '36.jpg', '37.jpg', '4.jpg', '5.jpg', '6.jpg',
 '7.jpg', '8.jpg', '9.jpg']

분명히 가장 중요한 숫자를 먼저 맹목적으로 분류합니다. sorted ()를 사용하여 시도했는데, 문제가 해결 될 것이라고 기대할 수는 있지만 아무런 차이가 없다는 것을 알 수 있습니다.

해결법

  1. ==============================

    1.각 파일 이름에 하나의 숫자 만 있다고 가정합니다.

    각 파일 이름에 하나의 숫자 만 있다고 가정합니다.

    >>> dirFiles = ['Picture 03.jpg', '02.jpg', '1.jpg']
    >>> dirFiles.sort(key=lambda f: int(filter(str.isdigit, f)))
    >>> dirFiles
    ['1.jpg', '02.jpg', 'Picture 03.jpg']
    
  2. ==============================

    2.모듈 natsort가 있습니다. 그냥 pip install natsort를 수행하십시오.

    모듈 natsort가 있습니다. 그냥 pip install natsort를 수행하십시오.

    >>> import natsort 
    >>> ll = ['Picture 13.jpg', 'Picture 14.jpg', 'Picture 15.jpg','Picture 0.jpg', 'Picture 1.jpg', 'Picture 10.jpg', 'Picture 11.jpg', 'Picture 12.jpg',  'Picture 16.jpg', 'Picture 17.jpg', 'Picture 18.jpg', 'Picture 19.jpg', 'Picture 2.jpg', 'Picture 20.jpg', 'Picture 21.jpg', 'Picture 22.jpg', 'Picture 23.jpg', 'Picture 24.jpg', 'Picture 25.jpg', 'Picture 26.jpg', 'Picture 27.jpg', 'Picture 28.jpg', 'Picture 29.jpg', 'Picture 3.jpg', 'Picture 30.jpg', 'Picture 31.jpg', 'Picture 32.jpg', 'Picture 33.jpg', 'Picture 34.jpg', 'Picture 35.jpg', 'Picture 36.jpg', 'Picture 37.jpg']         
    >>> print(natsort.natsorted(ll,reverse=True))
    ['Picture 37.jpg', 'Picture 36.jpg', 'Picture 35.jpg', 'Picture 34.jpg', 'Picture 33.jpg', 'Picture 32.jpg', 'Picture 31.jpg', 'Picture 30.jpg', 'Picture 29.jpg', 'Picture 28.jpg', 'Picture 27.jpg', 'Picture 26.jpg', 'Picture 25.jpg', 'Picture 24.jpg', 'Picture 23.jpg', 'Picture 22.jpg', 'Picture 21.jpg', 'Picture 20.jpg', 'Picture 19.jpg', 'Picture 18.jpg', 'Picture 17.jpg', 'Picture 16.jpg', 'Picture 15.jpg', 'Picture 14.jpg', 'Picture 13.jpg', 'Picture 12.jpg', 'Picture 11.jpg', 'Picture 10.jpg', 'Picture 3.jpg', 'Picture 2.jpg', 'Picture 1.jpg', 'Picture 0.jpg']
    
  3. ==============================

    3.[...]

    [...]

    splitext를 사용하여 확장자가없는 부분을 가져 와서 정렬 용 int로 변환 할 수 있습니다. 목록의 이름이 'l'이고 정렬 된 목록의 이름이 'lsorted'인 경우 다음을 사용할 수 있습니다.

    lsorted = sorted(l,key=lambda x: int(os.path.splitext(x)[0]))
    

    '10 .jpg '의 os.path.splitext는 ['10', '.jpg]]를 반환하므로 요소 0의 int ()를 사용하면 확장자가없는 파일 이름이 포함 할 수있는 문자열 만 포함 할 수 있습니다. int ()를 사용하여 정수로 변환 할 수 있습니다. 그렇지 않으면 오류가 발생합니다.

  4. from https://stackoverflow.com/questions/33159106/sort-filenames-in-directory-in-ascending-order by cc-by-sa and MIT license