Tôi cần một bộ tập tin hệ thống tập tin mà tôi có thể hướng dẫn bỏ qua các thư mục mà tôi muốn giữ nguyên, bao gồm tất cả các thư mục con bên dưới nhánh đó. Các os.walk và os.path.walk chỉ không làm điều đó.Một bộ tập lệnh Python có thể bỏ qua các thư mục
Trả lời
Vì vậy, tôi thực hiện điều này tại nhà vai trò walker chức năng:
import os
from os.path import join, isdir, islink, isfile
def mywalk(top, topdown=True, onerror=None, ignore_list=('.ignore',)):
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = os.listdir(top)
except Exception, err:
if onerror is not None:
onerror(err)
return
if len([1 for x in names if x in ignore_list]):
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
path = join(top, name)
if not islink(path):
for x in mywalk(path, topdown, onerror, ignore_list):
yield x
if not topdown:
yield top, dirs, nondirs
Có thể sửa đổi phần tử thứ hai của giá trị trả lại os.walk
's tại chỗ:
[...] người gọi có thể sửa đổi danh sách dirnames tại chỗ (có thể bằng cách sử dụng del hoặc phân bổ lát), và walk() sẽ chỉ recurse vào các thư mục con có tên vẫn còn trong dirnames; điều này có thể được sử dụng để prune tìm kiếm [...]
def fwalk(root, predicate):
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if predicate(r, d)]
yield dirpath, dirnames, filenames
Bây giờ, bạn có thể chỉ tay vào một vị cho các thư mục con:
>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
Trên thực tế, os.walk
có thể thực hiện chính xác những gì bạn muốn . Giả sử tôi có một danh sách (có thể là một tập hợp) các thư mục để bỏ qua trong ignore
. Sau đó, điều này sẽ hoạt động:
def my_walk(top_dir, ignore):
for dirpath, dirnames, filenames in os.walk(top_dir):
dirnames[:] = [
dn for dn in dirnames
if os.path.join(dirpath, dn) not in ignore ]
yield dirpath, dirnames, filenames
Đây là giải pháp tốt nhất và đơn giản nhất.
def walk(ignores):
global ignore
path = os.getcwd()
for root, dirs, files in os.walk(path):
for ignore in ignores:
if(ignore in dirs):
dirs.remove(ignore)
print root
print dirs
print files
walk(['.git', '.svn'])
Hãy nhớ rằng, nếu bạn xóa tên thư mục khỏi thư mục, nó sẽ không được khám phá bởi os.walk.
hy vọng nó sẽ giúp
- 1. Python: thư mục của tập lệnh
- 2. Danh sách các thư mục trong một thư mục, bỏ qua các tiểu thư mục ANT
- 3. bỏ qua các thư mục trong mercurial
- 4. Không thể hiểu cách gitignore bỏ qua các thư mục
- 5. Bỏ qua thư mục trong msdeploy
- 6. Bỏ qua SVN bỏ qua ... có thể?
- 7. Bỏ qua các thư mục trong PhpStorm
- 8. Diff Một thư mục đệ quy, bỏ qua tất cả các tập tin nhị phân:
- 9. SVN: Bỏ qua các thư mục con
- 10. Git có bỏ qua các thư mục trống không?
- 11. Lặp qua các tập tin trong một thư mục
- 12. Bỏ qua/bỏ qua thư mục/tệp trong TortoiseSVN
- 13. Thư mục tập lệnh LINQPad?
- 14. Git bỏ qua thư mục đã xóa cục bộ
- 15. Cách chuyển tên đường dẫn sang tập lệnh Python bằng cách "thả" tệp/thư mục qua biểu tượng tập lệnh
- 16. Làm thế nào tôi có thể thực sự làm Subversion bỏ qua một thư mục?
- 17. .gitignore sẽ không bỏ qua thư mục
- 18. Tập lệnh Ruby có thể cho biết thư mục đó nằm trong thư mục nào không?
- 19. Bỏ qua SVN - cách bỏ qua nội dung của một thư mục
- 20. Nhập tập lệnh từ thư mục gốc
- 21. .gitignore: Bỏ qua một thư mục cụ thể và một trong đó chỉ
- 22. SVN: Bỏ qua nhưng KHÔNG xóa một thư mục
- 23. cp: im lặng "bỏ qua thư mục" cảnh báo
- 24. Tôi có thể làm cho RecursiveDirectoryIterator bỏ qua các thư mục không đọc được không?
- 25. bash ~ để lặp qua các tập tin cụ thể trong một thư mục
- 26. bỏ qua tập tin nhất định trong tất cả các thư mục sử dụng một tập tin duy nhất .gitignore
- 27. thư mục con git bị bỏ qua
- 28. Thay đổi thư mục vào thư mục của tập lệnh Python
- 29. Sử dụng Python để thực hiện một lệnh trên tất cả các tập tin trong một thư mục
- 30. Bạn có thể "bỏ qua" một tệp trong Perforce không?
Tôi bằng cách nào đó quên về phân bổ lát, tôi đã tự do thêm mã đó vào mã của tôi. –
Đây là cách dự kiến để làm như vậy, thậm chí nói như vậy trong tài liệu hướng dẫn của os.path.walk(). – unwind
Không, ý tôi là phân bổ toàn bộ trang như là một cách sửa đổi toàn bộ danh sách, chứ không phải thực tế là bạn có thể thay đổi nó. –