디렉터리에서 필터링된 파일 목록 가져오기
Python을 사용하여 디렉토리의 파일 목록을 가져오려고 하는데 모든 파일 목록을 원하는 것은 아닙니다.
제가 기본적으로 원하는 것은 다음과 같은 일을 하지만 Python을 사용하고 ls를 실행하지 않는 것입니다.
ls 145592*.jpg
만약 이것을 위한 기본 제공 방법이 없다면, 나는 현재 포루프를 써서 그 결과를 반복할 생각이다.os.listdir()
일치하는 모든 파일을 새 목록에 추가합니다.
다만, 그 디렉토리에는 많은 파일이 있기 때문에, 보다 효율적인 방법(또는 빌트인 방식)이 있으면 좋겠다고 생각하고 있습니다.
import glob
jpgFilenamesList = glob.glob('145592*.jpg')
python 문서를 참조하십시오.
glob.glob()
(이그나시오에 따르면) 확실히 그렇게 할 수 있습니다.단, 보다 복잡한 매칭이 필요한 경우 목록 이해 및re.match()
, 다음과 같은 것이 있습니다.
files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]
유연성은 높지만 효율성은 떨어집니다.
심플화:
import os
relevant_path = "[path to folder]"
included_extensions = ['jpg','jpeg', 'bmp', 'png', 'gif']
file_names = [fn for fn in os.listdir(relevant_path)
if any(fn.endswith(ext) for ext in included_extensions)]
나는 영어로 읽기 쉽기 때문에 이런 형태의 목록 정리를 선호한다.
네 번째 행을 읽었습니다.경로에 대한 os.listdir의 각 fn에 대해 포함된 확장자 중 하나에 일치하는 것만 입력해 주세요.
초보 python 프로그래머가 필터링을 위해 목록 압축을 사용하는 데 실제로 익숙해지기는 어려울 수 있으며, 매우 큰 데이터 세트에 대해 약간의 메모리 오버헤드가 있을 수 있지만 디렉토리 및 기타 간단한 문자열 필터링 태스크를 나열하는 경우 목록 압축은 문서화할 수 있는 코드를 더 깨끗하게 만듭니다.
이 디자인의 유일한 점은 리스트 대신 스트링을 건네는 실수로부터 당신을 보호해 주지 않는다는 것입니다.예를 들어 실수로 문자열을 목록으로 변환하여 문자열의 모든 문자를 검사하게 되면 다수의 잘못된 긍정이 발생할 수 있습니다.
하지만 이해하기 어려운 해결책보다는 쉽게 해결할 수 있는 문제가 더 낫습니다.
다른 옵션:
>>> import os, fnmatch
>>> fnmatch.filter(os.listdir('.'), '*.py')
['manage.py']
https://docs.python.org/3/library/fnmatch.html
필터 처리 방법glob
모듈:
지구본 가져오기
import glob
와일드 카드:
files=glob.glob("data/*")
print(files)
Out:
['data/ks_10000_0', 'data/ks_1000_0', 'data/ks_100_0', 'data/ks_100_1',
'data/ks_100_2', 'data/ks_106_0', 'data/ks_19_0', 'data/ks_200_0', 'data/ks_200_1',
'data/ks_300_0', 'data/ks_30_0', 'data/ks_400_0', 'data/ks_40_0', 'data/ks_45_0',
'data/ks_4_0', 'data/ks_500_0', 'data/ks_50_0', 'data/ks_50_1', 'data/ks_60_0',
'data/ks_82_0', 'data/ks_lecture_dp_1', 'data/ks_lecture_dp_2']
역연장.txt
:
files = glob.glob("/home/ach/*/*.txt")
단일 문자
glob.glob("/home/ach/file?.txt")
번호 범위
glob.glob("/home/ach/*[0-9]*")
알파벳 범위
glob.glob("/home/ach/[a-c]*")
예비코드
import glob
import fnmatch
import pathlib
import os
pattern = '*.py'
path = '.'
해결책 1 - "글로브" 사용
# lookup in current dir
glob.glob(pattern)
In [2]: glob.glob(pattern)
Out[2]: ['wsgi.py', 'manage.py', 'tasks.py']
해결책 2 - "os" + "fnmatch" 사용
Variant 2.1 - 현재 dir에서의 룩업
# lookup in current dir
fnmatch.filter(os.listdir(path), pattern)
In [3]: fnmatch.filter(os.listdir(path), pattern)
Out[3]: ['wsgi.py', 'manage.py', 'tasks.py']
Variant 2.2 - 룩업 재귀
# lookup recursive
for dirpath, dirnames, filenames in os.walk(path):
if not filenames:
continue
pythonic_files = fnmatch.filter(filenames, pattern)
if pythonic_files:
for file in pythonic_files:
print('{}/{}'.format(dirpath, file))
결과
./wsgi.py
./manage.py
./tasks.py
./temp/temp.py
./apps/diaries/urls.py
./apps/diaries/signals.py
./apps/diaries/actions.py
./apps/diaries/querysets.py
./apps/library/tests/test_forms.py
./apps/library/migrations/0001_initial.py
./apps/polls/views.py
./apps/polls/formsets.py
./apps/polls/reports.py
./apps/polls/admin.py
해결책 3 - "pathlib" 사용
# lookup in current dir
path_ = pathlib.Path('.')
tuple(path_.glob(pattern))
# lookup recursive
tuple(path_.rglob(pattern))
주의:
- Python 3.4에서 테스트 완료
- "pathlib" 모듈은 Python 3.4에서만 추가되었습니다.
- Python 3.5는 glob.disp https://docs.python.org/3.5/library/glob.html#glob.glob을 사용한 재귀 검색 기능을 추가했습니다.제 기계는 Python 3.4를 탑재하고 있기 때문에 테스트하지 않았습니다.
os.walk를 사용하여 파일을 재귀적으로 나열합니다.
import os
root = "/home"
pattern = "145992"
alist_filter = ['jpg','bmp','png','gif']
path=os.path.join(root,"mydir_to_scan")
for r,d,f in os.walk(path):
for file in f:
if file[-3:] in alist_filter and pattern in file:
print os.path.join(root,file)
Python 표준 라이브러리 3.4 이상에서 사용할 수 있는 pathlib를 사용할 수 있습니다.
from pathlib import Path
files = [f for f in Path.cwd().iterdir() if f.match("145592*.jpg")]
import os
dir="/path/to/dir"
[x[0]+"/"+f for x in os.walk(dir) for f in x[2] if f.endswith(".jpg")]
그러면 전체 경로와 함께 jpg 파일 목록이 표시됩니다.할 수 요.x[0]+"/"+f
f
파일 이름만 받고., 이 경우, 이 경우 대신 사용할 .f.endswith(".jpg")
당신이 원하는 조건이라면 무엇이든 할 수 있어요.
보다 높은 수준의 접근방식을 원할 수도 있습니다(Find Tools로 구현 및 패키지화 완료).
from findtools.find_files import (find_files, Match)
# Recursively find all *.txt files in **/home/**
txt_files_pattern = Match(filetype='f', name='*.txt')
found_files = find_files(path='/home', match=txt_files_pattern)
for found_file in found_files:
print found_file
설치할 수 있다
pip install findtools
"path/to/images"에 "jpg" 및 "png" 확장자를 가진 파일 이름:
import os
accepted_extensions = ["jpg", "png"]
filenames = [fn for fn in os.listdir("path/to/images") if fn.split(".")[-1] in accepted_extensions]
패턴을 정의하고 확인할 수 있습니다.여기에서는 시작 패턴과 종료 패턴을 모두 가져와 파일 이름에서 찾아봅니다.FILES 에는, 디렉토리내의 모든 파일의 리스트가 포함되어 있습니다.
import os
PATTERN_START = "145592"
PATTERN_END = ".jpg"
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
for r,d,FILES in os.walk(CURRENT_DIR):
for FILE in FILES:
if PATTERN_START in FILE.startwith(PATTERN_START) and PATTERN_END in FILE.endswith(PATTERN_END):
print FILE
List Compensions와 그 안에 있는 regex 체커를 사용하여 지정된 postfix를 가진 이미지 파일을 포함하도록 단순화할 수 있습니다.
import re
import os
dir_name = "."
files = [os.path.join(dir_name, f) for f in os.listdir(dir_name) if re.match(r'.*\.(jpg|jpeg|png)', f)]
하위 프로세스를 사용할 수 있습니다.check_ouput()은 다음과 같습니다.
import subprocess
list_files = subprocess.check_output("ls 145992*.jpg", shell=True)
물론 따옴표 사이의 문자열은 셸에서 실행하는 모든 문자열이 될 수 있으며 출력을 저장할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2225564/get-a-filtered-list-of-files-in-a-directory
'programing' 카테고리의 다른 글
백틱과 아포스트로피의 큰 차이점은 무엇입니까? (0) | 2022.12.11 |
---|---|
$_POST를 발행하는 경우 (0) | 2022.12.11 |
MariaDB Galera 클러스터 설정 문제 (0) | 2022.12.11 |
Python 변수의 유형을 확인하는 가장 좋은(자동) 방법은 무엇입니까? (0) | 2022.12.11 |
데이터 URI를 파일로 변환한 후 FormData에 추가 (0) | 2022.12.11 |