Python에서 확장자가 .txt인 디렉토리에서 모든 파일 찾기
확장자를 가진 디렉토리의 모든 파일을 찾으려면 어떻게 해야 합니까?.txt비단뱀으로요?
다음을 사용할 수 있습니다.
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
또는 단순히:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
또는 디렉토리를 트래버스 하는 경우는, 다음과 같이 합니다.
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
글로브를 사용하세요.
>>> import glob
>>> glob.glob('./*.txt')
['./outline.txt', './pip-log.txt', './test.txt', './testingvim.txt']
뭐 그런 걸로 충분할 거야
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.txt'):
print(file)
를 1간단하게 사용할 수 있습니다.
import pathlib
list(pathlib.Path('your_directory').glob('*.txt'))
또는 루프에 있습니다.
for txt_file in pathlib.Path('your_directory').glob('*.txt'):
# do something with "txt_file"
재귀적으로 하고 싶은 경우는,.glob('**/*.txt')
1그pathlib모듈은 python 3.4의 표준 라이브러리에 포함되어 있습니다.단, 이전 Python 버전에도 해당 모듈의 백포트를 설치할 수 있습니다(즉, 를 사용하여).conda또는pip): 및.
다음과 같은 기능이 있습니다.
>>> import os
>>> path = '/usr/share/cups/charmaps'
>>> text_files = [f for f in os.listdir(path) if f.endswith('.txt')]
>>> text_files
['euc-cn.txt', 'euc-jp.txt', 'euc-kr.txt', 'euc-tw.txt', ... 'windows-950.txt']
import os
path = 'mypath/path'
files = os.listdir(path)
files_txt = [i for i in files if i.endswith('.txt')]
import os
for root, dirs, files in os.walk(dir):
for f in files:
if os.path.splitext(f)[1] == '.txt':
fullpath = os.path.join(root, f)
print(fullpath)
또는 발전기를 사용하는 경우:
import os
fileiter = (os.path.join(root, f)
for root, _, files in os.walk(dir)
for f in files)
txtfileiter = (f for f in fileiter if os.path.splitext(f)[1] == '.txt')
for txt in txtfileiter:
print(txt)
다음은 약간 다른 결과를 얻을 수 있는 동일한 버전의 추가입니다.
glob.iglob()
import glob
for f in glob.iglob("/mydir/*/*.txt"): # generator, search immediate subdirectories
print f
global.global1()
print glob.glob1("/mydir", "*.tx?") # literal_directory, basename_pattern
fnmatch.filter()
import fnmatch, os
print fnmatch.filter(os.listdir("/mydir"), "*.tx?") # include dot-files
이렇게 하면 모든 파일이 반복적으로 검색됩니다.
import glob, os
os.chdir("H:\\wallpaper")# use whatever directory you want
#double\\ no single \
for file in glob.glob("**/*.txt", recursive = True):
print(file)
Python v3.5+
재귀 함수에서 os.scandir를 사용하는 고속 메서드.폴더 및 하위 폴더에서 지정된 확장자를 가진 모든 파일을 검색합니다.10,000개의 파일을 찾는 데도 빠릅니다.
출력을 Panda Dataframe으로 변환하는 기능도 포함했습니다.
import os
import re
import pandas as pd
import numpy as np
def findFilesInFolderYield(path, extension, containsTxt='', subFolders = True, excludeText = ''):
""" Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)
path: Base directory to find files
extension: File extension to find. e.g. 'txt'. Regular expression. Or 'ls\d' to match ls1, ls2, ls3 etc
containsTxt: List of Strings, only finds file if it contains this text. Ignore if '' (or blank)
subFolders: Bool. If True, find files in all subfolders under path. If False, only searches files in the specified folder
excludeText: Text string. Ignore if ''. Will exclude if text string is in path.
"""
if type(containsTxt) == str: # if a string and not in a list
containsTxt = [containsTxt]
myregexobj = re.compile('\.' + extension + '$') # Makes sure the file extension is at the end and is preceded by a .
try: # Trapping a OSError or FileNotFoundError: File permissions problem I believe
for entry in os.scandir(path):
if entry.is_file() and myregexobj.search(entry.path): #
bools = [True for txt in containsTxt if txt in entry.path and (excludeText == '' or excludeText not in entry.path)]
if len(bools)== len(containsTxt):
yield entry.stat().st_size, entry.stat().st_atime_ns, entry.stat().st_mtime_ns, entry.stat().st_ctime_ns, entry.path
elif entry.is_dir() and subFolders: # if its a directory, then repeat process as a nested function
yield from findFilesInFolderYield(entry.path, extension, containsTxt, subFolders)
except OSError as ose:
print('Cannot access ' + path +'. Probably a permissions error ', ose)
except FileNotFoundError as fnf:
print(path +' not found ', fnf)
def findFilesInFolderYieldandGetDf(path, extension, containsTxt, subFolders = True, excludeText = ''):
""" Converts returned data from findFilesInFolderYield and creates and Pandas Dataframe.
Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)
path: Base directory to find files
extension: File extension to find. e.g. 'txt'. Regular expression. Or 'ls\d' to match ls1, ls2, ls3 etc
containsTxt: List of Strings, only finds file if it contains this text. Ignore if '' (or blank)
subFolders: Bool. If True, find files in all subfolders under path. If False, only searches files in the specified folder
excludeText: Text string. Ignore if ''. Will exclude if text string is in path.
"""
fileSizes, accessTimes, modificationTimes, creationTimes , paths = zip(*findFilesInFolderYield(path, extension, containsTxt, subFolders))
df = pd.DataFrame({
'FLS_File_Size':fileSizes,
'FLS_File_Access_Date':accessTimes,
'FLS_File_Modification_Date':np.array(modificationTimes).astype('timedelta64[ns]'),
'FLS_File_Creation_Date':creationTimes,
'FLS_File_PathName':paths,
})
df['FLS_File_Modification_Date'] = pd.to_datetime(df['FLS_File_Modification_Date'],infer_datetime_format=True)
df['FLS_File_Creation_Date'] = pd.to_datetime(df['FLS_File_Creation_Date'],infer_datetime_format=True)
df['FLS_File_Access_Date'] = pd.to_datetime(df['FLS_File_Access_Date'],infer_datetime_format=True)
return df
ext = 'txt' # regular expression
containsTxt=[]
path = 'C:\myFolder'
df = findFilesInFolderYieldandGetDf(path, ext, containsTxt, subFolders = True)
path.py도 다른 대안입니다.https://github.com/jaraco/path.py
from path import path
p = path('/path/to/the/directory')
for f in p.files(pattern='*.txt'):
print f
'dataPath' 폴더 내의 모든 '.txt' 파일 이름을 Phythonic 방식으로 목록으로 가져오려면:
from os import listdir
from os.path import isfile, join
path = "/dataPath/"
onlyTxtFiles = [f for f in listdir(path) if isfile(join(path, f)) and f.endswith(".txt")]
print onlyTxtFiles
Python에는 이를 위한 모든 도구가 있습니다.
import os
the_dir = 'the_dir_that_want_to_search_in'
all_txt_files = filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))
테스트(Python 3.6.4, W7x64)를 실시해, 서브 디렉토리가 없는 1개의 폴더에 대해서, 특정의 확장자를 가지는 파일의 완전한 파일 패스의 리스트를 취득하는 것이 가장 빠른 솔루션을 확인했습니다.
간단히 말하면, 이 태스크의 경우os.listdir()가장 빠르고 차선책보다 1.7배 빠릅니다.os.walk()(휴대시간 포함), 2.7배 빠른 속도pathlib, 3.2배 고속os.scandir()3.3배 고속으로glob.
이러한 결과는 재귀적인 결과가 필요할 때 변경될 수 있습니다.다음 중 하나의 메서드를 복사/붙여넣을 경우 .lower()를 추가해 주세요.그렇지 않으면 .lower()를 추가해 주세요..ext를 검색할 때 EXT를 찾을 수 없습니다.
import os
import pathlib
import timeit
import glob
def a():
path = pathlib.Path().cwd()
list_sqlite_files = [str(f) for f in path.glob("*.sqlite")]
def b():
path = os.getcwd()
list_sqlite_files = [f.path for f in os.scandir(path) if os.path.splitext(f)[1] == ".sqlite"]
def c():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith(".sqlite")]
def d():
path = os.getcwd()
os.chdir(path)
list_sqlite_files = [os.path.join(path, f) for f in glob.glob("*.sqlite")]
def e():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in glob.glob1(str(path), "*.sqlite")]
def f():
path = os.getcwd()
list_sqlite_files = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".sqlite"):
list_sqlite_files.append( os.path.join(root, file) )
break
print(timeit.timeit(a, number=1000))
print(timeit.timeit(b, number=1000))
print(timeit.timeit(c, number=1000))
print(timeit.timeit(d, number=1000))
print(timeit.timeit(e, number=1000))
print(timeit.timeit(f, number=1000))
결과:
# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274
import os
import sys
if len(sys.argv)==2:
print('no params')
sys.exit(1)
dir = sys.argv[1]
mask= sys.argv[2]
files = os.listdir(dir);
res = filter(lambda x: x.endswith(mask), files);
print res
같은 디렉토리에 있는 "data"라는 폴더에서 ".txt" 파일 이름의 배열을 가져오려면 보통 다음과 같은 간단한 코드 줄을 사용합니다.
import os
fileNames = [fileName for fileName in os.listdir("data") if fileName.endswith(".txt")]
이 암호는 내 삶을 더 단순하게 만든다.
import os
fnames = ([file for root, dirs, files in os.walk(dir)
for file in files
if file.endswith('.txt') #or file.endswith('.png') or file.endswith('.pdf')
])
for fname in fnames: print(fname)
fnmatch 사용:https://docs.python.org/2/library/fnmatch.html
import fnmatch
import os
for file in os.listdir('.'):
if fnmatch.fnmatch(file, '*.txt'):
print file
ghostdog와 유사한 복사 붙여넣기 가능한 솔루션:
def get_all_filepaths(root_path, ext):
"""
Search all files which have a given extension within root_path.
This ignores the case of the extension and searches subdirectories, too.
Parameters
----------
root_path : str
ext : str
Returns
-------
list of str
Examples
--------
>>> get_all_filepaths('/run', '.lock')
['/run/unattended-upgrades.lock',
'/run/mlocate.daily.lock',
'/run/xtables.lock',
'/run/mysqld/mysqld.sock.lock',
'/run/postgresql/.s.PGSQL.5432.lock',
'/run/network/.ifstate.lock',
'/run/lock/asound.state.lock']
"""
import os
all_files = []
for root, dirs, files in os.walk(root_path):
for filename in files:
if filename.lower().endswith(ext):
all_files.append(os.path.join(root, filename))
return all_files
이 경우에도 하실 수 있습니다.yield제너레이터를 생성하여 전체 목록을 조합하지 않도록 합니다.
def get_all_filepaths(root_path, ext):
import os
for root, dirs, files in os.walk(root_path):
for filename in files:
if filename.lower().endswith(ext):
yield os.path.join(root, filename)
fnmatch와 upper 메서드를 사용하는 것이 좋습니다.이렇게 하면 다음 중 하나를 찾을 수 있습니다.
- Name.txt;
- Name.TXT;
- Name.Txt
.
import fnmatch
import os
for file in os.listdir("/Users/Johnny/Desktop/MyTXTfolder"):
if fnmatch.fnmatch(file.upper(), '*.TXT'):
print(file)
extend()
types = ('*.jpg', '*.png')
images_list = []
for files in types:
images_list.extend(glob.glob(os.path.join(path, files)))
서브 디렉토리가 있는 기능 솔루션:
from fnmatch import filter
from functools import partial
from itertools import chain
from os import path, walk
print(*chain(*(map(partial(path.join, root), filter(filenames, "*.txt")) for root, _, filenames in walk("mydir"))))
폴더에 많은 파일이 포함되어 있거나 메모리가 제약되는 경우 생성기 사용을 고려하십시오.
def yield_files_with_extensions(folder_path, file_extension):
for _, _, files in os.walk(folder_path):
for file in files:
if file.endswith(file_extension):
yield file
옵션 A: 반복
for f in yield_files_with_extensions('.', '.txt'):
print(f)
옵션 B: 모두 취득
files = [f for f in yield_files_with_extensions('.', '.txt')]
Python OS 모듈을 사용하여 특정 확장자를 가진 파일을 찾습니다.
간단한 예는 다음과 같습니다.
import os
# This is the path where you want to search
path = r'd:'
# this is extension you want to detect
extension = '.txt' # this can be : .jpg .png .xls .log .....
for root, dirs_list, files_list in os.walk(path):
for file_name in files_list:
if os.path.splitext(file_name)[-1] == extension:
file_name_path = os.path.join(root, file_name)
print file_name
print file_name_path # This is the full path of the filter file
을 달아주고 .os.walk 및 및그 이 포함됩니다.
import os
def files_in_dir(path, extension=''):
"""
Generator: yields all of the files in <path> ending with
<extension>
\param path Absolute or relative path to inspect,
\param extension [optional] Only yield files matching this,
\yield [filenames]
"""
for _, dirs, files in os.walk(path):
dirs[:] = [] # do not recurse directories.
yield from [f for f in files if f.endswith(extension)]
# Example: print all the .py files in './python'
for filename in files_in_dir('./python', '*.py'):
print("-", filename)
또는 발전기가 필요 없는 일회성:
path, ext = "./python", ext = ".py"
for _, _, dirfiles in os.walk(path):
matches = (f for f in dirfiles if f.endswith(ext))
break
for filename in matches:
print("-", filename)
다른 용도로 일치 항목을 사용하는 경우 생성자 식 대신 목록으로 만들 수 있습니다.
matches = [f for f in dirfiles if f.endswith(ext)]
언급URL : https://stackoverflow.com/questions/3964681/find-all-files-in-a-directory-with-extension-txt-in-python
'source' 카테고리의 다른 글
| OS X의 sem_init (0) | 2022.11.24 |
|---|---|
| C 표준 라이브러리의 기능을 위험하게 하는 것은 무엇이며, 대체 방법은 무엇입니까? (0) | 2022.11.24 |
| MySQL 계층 재귀 쿼리를 만드는 방법 (0) | 2022.11.24 |
| 코드의 메서드에서 현재 콜스택 인쇄 (0) | 2022.11.24 |
| 표준 입력에서 한 줄씩 읽는 방법 (0) | 2022.11.24 |