Câu trả lời:
Đây là một cách để duyệt qua mọi tệp và thư mục trong cây thư mục:
import os
for dirname, dirnames, filenames in os.walk('.'):
# print path to all subdirectories first.
for subdirname in dirnames:
print(os.path.join(dirname, subdirname))
# print path to all filenames.
for filename in filenames:
print(os.path.join(dirname, filename))
# Advanced usage:
# editing the 'dirnames' list will stop os.walk() from recursing into there.
if '.git' in dirnames:
# don't go into any .git directories.
dirnames.remove('.git')
for subdirname in dirnames: if subdirname != '.git'
Bạn có thể dùng
os.listdir(path)
Để tham khảo và nhiều chức năng os xem tại đây:
os.scandir
Tuy nhiên, tài liệu python 3 bảo bạn sử dụng thay vào đó, vì trong nhiều trường hợp, nó cho phép bạn ngăn chặn các cuộc gọi hệ thống, cho phép tăng tốc miễn phí (cả IPC và IO đều chậm).
os.path.isdir
.
Đây là một chức năng trợ giúp tôi sử dụng khá thường xuyên:
import os
def listdir_fullpath(d):
return [os.path.join(d, f) for f in os.listdir(d)]
Thử cái này:
import os
for top, dirs, files in os.walk('./'):
for nm in files:
print os.path.join(top, nm)
Đối với các tệp trong thư mục làm việc hiện tại mà không chỉ định đường dẫn
Python 2.7:
import os
os.listdir(os.getcwd())
Python 3.x:
import os
os.listdir()
Cảm ơn Stam Kaly đã bình luận về python 3.x
os.listdir()
liệt kê các thành phần trong thư mục hiện tại theo mặc định! Vì vậy, không cần os.getcwd()
:)
Thực hiện đệ quy
import os
def scan_dir(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
print path
else:
scan_dir(path)
Tôi đã viết một phiên bản dài, với tất cả các tùy chọn tôi có thể cần: http://sam.nipl.net/code/python/find.py
Tôi đoán nó cũng sẽ phù hợp ở đây:
#!/usr/bin/env python
import os
import sys
def ls(dir, hidden=False, relative=True):
nodes = []
for nm in os.listdir(dir):
if not hidden and nm.startswith('.'):
continue
if not relative:
nm = os.path.join(dir, nm)
nodes.append(nm)
nodes.sort()
return nodes
def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
root = os.path.join(root, '') # add slash if not there
for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
if relative:
parent = parent[len(root):]
if dirs and parent:
yield os.path.join(parent, '')
if not hidden:
lfiles = [nm for nm in lfiles if not nm.startswith('.')]
ldirs[:] = [nm for nm in ldirs if not nm.startswith('.')] # in place
if files:
lfiles.sort()
for nm in lfiles:
nm = os.path.join(parent, nm)
yield nm
def test(root):
print "* directory listing, with hidden files:"
print ls(root, hidden=True)
print
print "* recursive listing, with dirs, but no hidden files:"
for f in find(root, dirs=True):
print f
print
if __name__ == "__main__":
test(*sys.argv[1:])
Đây là một lựa chọn khác.
os.scandir(path='.')
Nó trả về một iterator của các đối tượng os.DirEntry tương ứng với các mục (cùng với thông tin thuộc tính tệp) trong thư mục được cung cấp bởi đường dẫn.
Thí dụ:
with os.scandir(path) as it:
for entry in it:
if not entry.name.startswith('.'):
print(entry.name)
Sử dụng scandir () thay cho listdir () có thể làm tăng đáng kể hiệu năng của mã cũng cần loại tệp hoặc thông tin thuộc tính tệp , vì các đối tượng os.DirEntry lộ thông tin này nếu hệ điều hành cung cấp nó khi quét thư mục. Tất cả các phương thức os.DirEntry có thể thực hiện một cuộc gọi hệ thống, nhưng is_dir () và is_file () thường chỉ yêu cầu một cuộc gọi hệ thống cho các liên kết tượng trưng; os.DirEntry.stat () luôn yêu cầu một cuộc gọi hệ thống trên Unix nhưng chỉ yêu cầu một liên kết tượng trưng trên Windows.
Mặc dù os.listdir()
rất tốt để tạo danh sách tên tệp và thư mục, nhưng bạn thường muốn làm nhiều hơn một khi bạn có những tên đó - và trong Python3, pathlib làm cho các công việc khác trở nên đơn giản. Hãy xem và xem bạn có thích nó nhiều như tôi không.
Để liệt kê nội dung dir, xây dựng một đối tượng Path và lấy iterator:
In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>
Nếu chúng ta chỉ muốn một danh sách tên của những thứ:
In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
'ntp-restrict.conf',
'periodic',
Nếu bạn chỉ muốn các thư mục:
In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
'periodic',
'mach_init.d',
Nếu bạn muốn tên của tất cả các tệp conf trong cây đó:
In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
'dnsextd.conf',
'syslog.conf',
Nếu bạn muốn một danh sách các tệp conf trong cây> = 1K:
In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
'pf.conf',
'autofs.conf',
Giải quyết các đường dẫn tương đối trở nên dễ dàng:
In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')
Điều hướng với một Đường dẫn khá rõ ràng (mặc dù không mong đợi):
In [10]: p = Path('.')
In [11]: core = p / 'web' / 'core'
In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
PosixPath('web/core/services.py'),
PosixPath('web/core/querysets.py'),
Một lót đẹp để liệt kê chỉ các tệp đệ quy. Tôi đã sử dụng điều này trong chỉ thị setup.py pack_data:
import os
[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]
Tôi biết đó không phải là câu trả lời cho câu hỏi, nhưng có thể có ích
#!/bin/python2
import os
def scan_dir(path):
print map(os.path.abspath, os.listdir(pwd))
Đối với bộ lọc và bản đồ, bạn cần bọc chúng bằng list ()
#!/bin/python3
import os
def scan_dir(path):
print(list(map(os.path.abspath, os.listdir(pwd))))
Đề xuất bây giờ là bạn thay thế việc sử dụng bản đồ và bộ lọc của mình bằng các biểu thức của trình tạo hoặc danh sách hiểu:
#!/bin/python
import os
def scan_dir(path):
print([os.path.abspath(f) for f in os.listdir(path)])
Đây là phiên bản Pythonic một dòng:
import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]
Mã này liệt kê đường dẫn đầy đủ của tất cả các tệp và thư mục trong tên thư mục đã cho.
Tôi biết đây là một câu hỏi cũ. Đây là một cách gọn gàng tôi đã gặp nếu bạn đang sử dụng máy liunx.
import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))
#import modules
import os
_CURRENT_DIR = '.'
def rec_tree_traverse(curr_dir, indent):
"recurcive function to traverse the directory"
#print "[traverse_tree]"
try :
dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
except:
print "wrong path name/directory name"
return
for file_or_dir in dfList:
if os.path.isdir(file_or_dir):
#print "dir : ",
print indent, file_or_dir,"\\"
rec_tree_traverse(file_or_dir, indent*2)
if os.path.isfile(file_or_dir):
#print "file : ",
print indent, file_or_dir
#end if for loop
#end of traverse_tree()
def main():
base_dir = _CURRENT_DIR
rec_tree_traverse(base_dir," ")
raw_input("enter any key to exit....")
#end of main()
if __name__ == '__main__':
main()
FYI Thêm bộ lọc mở rộng hoặc mở rộng tệp nhập os
path = '.'
for dirname, dirnames, filenames in os.walk(path):
# print path to all filenames with extension py.
for filename in filenames:
fname_path = os.path.join(dirname, filename)
fext = os.path.splitext(fname_path)[1]
if fext == '.py':
print fname_path
else:
continue
Dưới đây mã sẽ liệt kê các thư mục và các tập tin trong thư mục
def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath,sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
Phiên bản làm việc với tôi là một phiên bản sửa đổi từ câu trả lời của Saleh ở trên.
Mã như sau:
"dir = 'give_directory_name' filenames = [os.path.abspath (os.path.join (dir, i)) cho tôi trong os.listdir (dir)]"