Hướng dẫn python scandir vs listdir - python scandir vs listdir
Tôi đã cố gắng tối ưu hóa chức năng duyệt tệp được viết bằng python, trên windows, bằng cách sử dụng os.scandir () thay vì os.listdir (). Tuy nhiên, thời gian vẫn không thay đổi, khoảng 2 phút rưỡi, và tôi không thể nói tại sao. Dưới đây là các chức năng, nguyên bản và thay đổi: Show
Phiên bản os.listdir ():
Phiên bản OS.Scandir ():
Ngoài ra, đây là các chức năng phụ trợ được sử dụng trong phạm vi này:
Có ai có giải pháp cho cách tôi có thể làm cho chức năng chạy nhanh hơn không? Giả định của tôi là việc trích xuất tên và đường dẫn ở đầu làm cho nó chạy chậm hơn nó, điều đó có đúng không?
trừu tượngCơ sở lý luận Cơ sở lý luậnThực hiện Cụ thể của đề xuất Ví dụ Ghi chú về bộ nhớ đệm8-9 times as fast on Windows, and about 2-3 times as fast on POSIX systems. So we’re not talking about micro- optimizations. See more benchmarks here. Ghi chú về xử lý ngoại lệ Ủng hộ Thực hiệnCụ thể của đề xuất Ví dụ Cụ thể của đề xuấtos.scandir()Ví dụ scandir(path='.') -> generator of DirEntry objects Ghi chú về bộ nhớ đệm
2 mang lại một đối tượng scandir(path='.') -> generator of DirEntry objects1 cho mỗi tệp và thư mục phụ trong 9. Giống như 7, các hướng dẫn giả scandir(path='.') -> generator of DirEntry objects7 và scandir(path='.') -> generator of DirEntry objects8 được bỏ qua và các mục được mang lại theo thứ tự phụ thuộc vào hệ thống. Mỗi đối tượng scandir(path='.') -> generator of DirEntry objects1 có các thuộc tính và phương thức sau:
Tất cả các phương thức có thể thực hiện các cuộc gọi hệ thống trong một số trường hợp và do đó có thể tăng def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4 - xem phần Ghi chú trên phần Xử lý ngoại lệ để biết thêm chi tiết. Thuộc tính và tên phương thức scandir(path='.') -> generator of DirEntry objects1 được chọn giống như các thuộc tính trong mô -đun def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total6 mới nếu có thể, cho tính nhất quán. Sự khác biệt duy nhất về chức năng là các phương thức scandir(path='.') -> generator of DirEntry objects1 đã lưu bộ đệm các giá trị của chúng trên đối tượng nhập sau cuộc gọi đầu tiên. Giống như các hàm khác trong mô -đun 5, 2 chấp nhận một đối tượng byte hoặc STR cho tham số 9 và trả về các thuộc tính it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break1 và it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break2 có cùng loại với 9. Tuy nhiên, bạn nên sử dụng loại STR, vì điều này đảm bảo hỗ trợ đa nền tảng cho tên tệp unicode. .os.walk()Là một phần của đề xuất này, 2 thay vì it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break6 và it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break7. Điều này sẽ tăng tốc độ os.walk() rất đáng kể (như đã đề cập ở trên, bằng 2-20 lần, tùy thuộc vào hệ thống).Ví dụĐầu tiên, một ví dụ rất đơn giản về 2 hiển thị việc sử dụng thuộc tính it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break1 và phương thức os.scandir() 1:def subdirs(path): """Yield directory names not starting with '.' under given path.""" for entry in os.scandir(path): if not entry.name.startswith('.') and entry.is_dir(): yield entry.name Hàm 2 và it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break7 trên cả hệ thống Windows và Posix, đặc biệt là trên các thư mục cỡ trung bình hoặc lớn. Hoặc, để có được tổng kích thước của các tệp trong một cây thư mục, hiển thị việc sử dụng phương thức it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break2: def get_tree_size(path): """Return total size of files in given path and subdirs.""" total = 0 for entry in os.scandir(path): if entry.is_dir(follow_symlinks=False): total += get_tree_size(entry.path) else: total += entry.stat(follow_symlinks=False).st_size return total Điều này cũng cho thấy việc sử dụng tham số def get_tree_size(path): """Return total size of files in given path and subdirs.""" total = 0 for entry in os.scandir(path): if entry.is_dir(follow_symlinks=False): total += get_tree_size(entry.path) else: total += entry.stat(follow_symlinks=False).st_size return total1 thành os.scandir() 8 - trong một hàm đệ quy như thế này, có lẽ chúng ta không muốn theo các liên kết. .Lưu ý rằng Ghi chú về bộ nhớ đệmCác đối tượng scandir(path='.') -> generator of DirEntry objects1 tương đối ngu ngốc - các thuộc tính def subdirs(path): """Yield directory names not starting with '.' under given path.""" for entry in os.scandir(path): if not entry.name.startswith('.') and entry.is_dir(): yield entry.name0 và 9 rõ ràng luôn được lưu trữ và các phương thức os.walk() 3 và os.walk() 4 lưu trữ các giá trị của chúng (ngay lập tức trên Windows thông qua hệ thống.Vì lý do này, các đối tượng scandir(path='.') -> generator of DirEntry objects1 được dự định sẽ được sử dụng và vứt bỏ sau khi lặp lại, không được lưu trữ trong dữ liệu tồn tại lâu dài được cấu trúc và các phương thức được gọi hết lần này đến lần khác. Nếu các nhà phát triển muốn hành vi làm mới của người Viking (ví dụ, để xem thay đổi kích thước tệp), họ chỉ có thể sử dụng các đối tượng 00 thông thường nhận được dữ liệu mới từ hệ điều hành mỗi cuộc gọi.Ghi chú về xử lý ngoại lệ 01 và os.scandir() 5 là các phương thức rõ ràng thay vì các thuộc tính hoặc thuộc tính, để làm rõ rằng chúng có thể không phải là hoạt động rẻ tiền (mặc dù chúng thường là như vậy) và chúng có thể thực hiện một cuộc gọi hệ thống. Do đó, các phương pháp này có thể tăng def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4. Ví dụ: 01 sẽ thực hiện cuộc gọi hệ thống 3 trên các hệ thống đó nếu 07 không hỗ trợ 08 hoặc trả về điều kiện hoặc trên một số hệ thống tập tin.Thông thường, điều này không quan trọng - ví dụ, it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break6. Ngoài ra, bởi vì hành vi gây ra ngoại lệ của các phương pháp 13 phù hợp với def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total6-chỉ tăng def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4 trong trường hợp quyền hoặc các lỗi gây tử vong khác, nhưng trả về sai nếu đường dẫn không tồn tại cần thiết để bắt lỗi xung quanh các cuộc gọi 16.Tuy nhiên, khi người dùng yêu cầu xử lý lỗi hạt mịn, có thể mong muốn bắt def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4 xung quanh tất cả các cuộc gọi phương thức và xử lý khi thích hợp. Ví dụ: bên dưới là phiên bản của ví dụ def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total Ủng hộMô-đun Scandir trên GitHub đã được đưa ra và được sử dụng khá nhiều (xem sử dụng trên mạng hoang dã trong PEP này), nhưng cũng có một chút hỗ trợ trực tiếp cho chức năng giống như scandir từ các nhà phát triển cốt lõi và những người khác trên Python -Dev và Python-Ideas Danh sách gửi thư. Một mẫu:
Hỗ trợ cho bản thân PEP này (hỗ trợ meta?) Đã được Nick Coghlan đưa ra trên Python-dev: Một PEP xem xét tất cả điều này cho 3.5 và đề xuất một API OS.Scandir cụ thể sẽ là một điều tốt. [Nguồn7] Sử dụng trong tự nhiênCho đến nay, việc triển khai 6 chắc chắn rất hữu ích, nhưng đã được đánh dấu rõ ràng là Beta Beta, vì vậy, nó không chắc chắn việc sử dụng nó có bao nhiêu trong tự nhiên. Ben Hoyt đã có một số báo cáo từ những người sử dụng nó. Ví dụ:
Những người khác đã yêu cầu một gói PYPI cho nó, đã được tạo ra. Xem gói PYPI. Các số liệu thống kê của GitHub có nghĩa là quá nhiều, nhưng Scandir có một số người theo dõi, vấn đề, dĩa, v.v ... Tại đây, các số liệu thống kê kể từ ngày 7 tháng 7 năm 2014:
Ngoài ra, vì PEP này sẽ tăng tốc độ 21 (194.000) như có 22 (230.000).Từ chối ý tưởngĐặt tênỨng cử viên thực sự duy nhất khác cho chức năng này Tên tên là 23. Tuy nhiên, các chức năng 24 trong Python (chủ yếu được tìm thấy trong Python 2) có xu hướng tương đương iterator đơn giản của các đối tác không phải điều khiển của chúng. Ví dụ, 25 chỉ là phiên bản ererator của 26, nhưng các đối tượng được trả về là giống hệt nhau. Tuy nhiên, trong trường hợp ____ 22, các giá trị trả về là các đối tượng khá khác nhau (scandir(path='.') -> generator of DirEntry objects1 đối tượng so với chuỗi tên tệp), vì vậy điều này có thể được phản ánh bởi sự khác biệt về tên - do đó 2.Xem một số cuộc thảo luận có liên quan về Python-dev. người hỗ trợ ký đại diện________ 15/________ 16 trên Windows Hỗ trợ vượt qua một loài đại diện của người Hồi giáo như 32, vì vậy, những người đầu tiên (bao gồm cả tác giả PEP này) cảm thấy sẽ là một ý tưởng tốt để bao gồm một đối số từ khóa 33 cho chức năng 6 để người dùng có thể chuyển điều này.Tuy nhiên, theo suy nghĩ và thảo luận thêm, người ta đã quyết định rằng đây sẽ là ý tưởng tồi, trừ khi nó có thể được thực hiện đa nền tảng (một đối số từ khóa 35 hoặc tương tự). Điều này có vẻ đủ dễ dàng lúc đầu-chỉ cần sử dụng hỗ trợ đại diện OS trên Windows và một cái gì đó như 36 hoặc 37 sau đó trên các hệ thống dựa trên POSIX.Thật không may, các quy tắc phù hợp với Wildcard Windows chính xác không thực sự được Microsoft ghi lại ở bất cứ đâu và chúng khá kỳ quặc (xem bài đăng trên blog này), có nghĩa là nó rất có vấn đề khi mô phỏng bằng cách sử dụng 36 hoặc regexes.Vì vậy, sự đồng thuận là hỗ trợ Wildcard của Windows là một ý tưởng tồi. Có thể thêm vào một ngày sau đó nếu có một cách đa nền tảng để đạt được nó, nhưng không phải cho phiên bản ban đầu. Đọc thêm về chủ đề Python-Ideas tháng 11 năm 2012 này và chủ đề Python-Dev tháng 6 năm 2014 này trên PEP 471. Các phương thức không theo dõi các liên kết symlink theo mặc địnhCó nhiều cuộc tranh luận về Python-Dev (xem tin nhắn trong chuỗi này) về việc liệu các phương thức scandir(path='.') -> generator of DirEntry objects1 có nên tuân theo các liên kết tượng trưng hay không (khi các phương thức 16 không có tham số def get_tree_size(path): """Return total size of files in given path and subdirs.""" total = 0 for entry in os.scandir(path): if entry.is_dir(follow_symlinks=False): total += get_tree_size(entry.path) else: total += entry.stat(follow_symlinks=False).st_size return total1). Ban đầu họ đã không (xem các phiên bản trước của mô-đun PEP và Scandir.py này), nhưng Victor Stinner đã đưa ra một trường hợp khá hấp dẫn trên Python-dev rằng theo các liên kết symlink theo mặc định là một ý tưởng tốt hơn, bởi vì:
Như một trường hợp cụ thể cho thấy phiên bản không liên kết có liên kết có lỗi, tác giả PEP này đã gây ra lỗi do kiểm tra chính xác này sai trong việc triển khai 47 ban đầu của anh ấy trong scandir.py (xem vấn đề #4 tại đây).Cuối cùng, không có sự thỏa thuận nào rằng các phương pháp nên tuân theo các liên kết của Symlink, nhưng có sự đồng thuận cơ bản giữa những người tham gia có liên quan nhiều nhất và tác giả PEP này tin rằng trường hợp trên đủ mạnh để đảm bảo theo các liên kết symlink theo mặc định. Ngoài ra, nó rất đơn giản để gọi các phương thức có liên quan với 48 nếu hành vi khác là mong muốn.Thuộc tính direntry là thuộc tínhTrong một số cách, nó sẽ đẹp hơn cho scandir(path='.') -> generator of DirEntry objects1 16 và 3 để trở thành thuộc tính thay vì các phương thức, để chỉ ra rằng chúng rất rẻ hoặc miễn phí. Tuy nhiên, đây không phải là trường hợp, vì 3 sẽ yêu cầu gọi hệ điều hành trên các hệ thống dựa trên POSIX nhưng không phải trên Windows. Ngay cả os.scandir() 8 và bạn bè cũng có thể thực hiện cuộc gọi HĐH trên các hệ thống dựa trên POSIX nếu giá trị 54 là 10 (trên một số hệ thống tệp nhất định).Ngoài ra, mọi người sẽ mong đợi quyền truy cập thuộc tính 56 chỉ tăng 57, chứ không phải def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4 trong trường hợp nó thực hiện một cuộc gọi hệ thống theo bìa. Mã gọi sẽ phải có ________ 159/________ 160 xung quanh những gì trông giống như một quyền truy cập thuộc tính đơn giản, và do đó, nó tốt hơn nhiều để tạo ra các phương thức của chúng. Xem chủ đề Python-dev tháng 5 năm 2013 này, nơi tác giả PEP này đưa ra trường hợp này và có thỏa thuận từ một nhà phát triển cốt lõi. Các trường Direntry là các đối tượng chỉ thuộc tính thuộc tính tĩnhTrong thông điệp Python-Dev tháng 7 năm 2014 này, Paul Moore đã đề xuất một giải pháp là một trình bao bọc mỏng của người Viking, trong đó đối tượng scandir(path='.') -> generator of DirEntry objects1 chỉ có các thuộc tính tĩnh: def subdirs(path): """Yield directory names not starting with '.' under given path.""" for entry in os.scandir(path): if not entry.name.startswith('.') and entry.is_dir(): yield entry.name0, 9 và os.walk() 3, với các thuộc tính 65 chỉ có trên Windows . Ý tưởng là sử dụng chức năng cấp thấp hơn, đơn giản hơn như một khối xây dựng cho các chức năng cấp cao hơn.Lúc đầu, có thỏa thuận chung đơn giản hóa theo cách này là một điều tốt. Tuy nhiên, có hai vấn đề với phương pháp này. Đầu tiên, giả định là 66 và các thuộc tính tương tự luôn có mặt trên POSIX, đó là trường hợp (nếu 08 không có mặt hoặc là 10). Thứ hai, nó có một API khó sử dụng hơn nhiều trong thực tế, vì ngay cả các thuộc tính 66 cũng không có mặt trên POSIX và sẽ cần phải được kiểm tra với 70 và sau đó 0 được gọi nếu chúng có mặt.Xem phản hồi Python-Dev tháng 7 năm 2014 này từ tác giả PEP này chi tiết tại sao tùy chọn này là một giải pháp không lý tưởng và câu trả lời tiếp theo từ thỏa thuận lồng tiếng cho Paul Moore. Các trường Direntry đang tĩnh với tùy chọn đảm bảo_lstatMột lựa chọn có vẻ đơn giản và hấp dẫn khác đã được Nick Coghlan đề xuất trong thông điệp Python-Dev tháng 6 năm 2014 này: Tạo các thuộc tính 13 và 73 và điền vào thời gian lặp 73, nhưng chỉ khi đối số mới 75 được quy định trong cuộc gọi 2.Điều này có lợi thế hơn ở trên rằng bạn có thể dễ dàng nhận được kết quả STAT từ 2 nếu bạn cần. Tuy nhiên, nó có nhược điểm nghiêm trọng là việc xử lý lỗi hạt mịn là lộn xộn, bởi vì 3 sẽ được gọi (và do đó có khả năng tăng def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total4) trong quá trình lặp, dẫn đến một vòng lặp khá xấu xí, được làm bằng tay: it = os.scandir(path) while True: try: entry = next(it) except OSError as error: handle_error(path, error) except StopIteration: break Hoặc điều đó có nghĩa là 2 sẽ phải chấp nhận đối số 81 - một hàm để gọi khi xảy ra lỗi 3 trong quá trình lặp. Điều này dường như đối với tác giả PEP, không trực tiếp cũng như Pythonic như ________ 159/________ 160 xung quanh một cuộc gọi os.scandir() 5.Một nhược điểm khác là def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total2 trên POSIX sẽ không mang lại bất kỳ tốc độ tăng tốc. Trong hầu hết các trường hợp, bạn không cần đối tượng 8 đầy đủ - các phương thức 16 là đủ và thông tin này đã được biết đến.Xem Ben Hoyt sườn tháng 7 năm 2014 Trả lời cuộc thảo luận tóm tắt điều này và chi tiết lý do tại sao ông nghĩ rằng đề xuất PEP 471 ban đầu là một trong những điều đúng đắn. Trả về các giá trị là (tên, stat_result) hai bộ phậnBan đầu, tác giả PEP này đã đề xuất khái niệm này như một hàm gọi là 90 mang lại hai bộ đôi (tên, stat_result). Điều này có lợi thế là không có loại mới được giới thiệu. Tuy nhiên, 8 chỉ được lấp đầy một phần trên các hệ thống dựa trên POSIX (hầu hết các trường được đặt thành 92 và các quirks khác), vì vậy chúng không thực sự là các đối tượng 8, và điều này sẽ phải được ghi lại hoàn toàn khác với 0.Ngoài ra, Python có hỗ trợ tốt cho các đối tượng thích hợp với các thuộc tính và phương thức, tạo ra một API đơn giản và đơn giản hơn hai bộ phận. Nó cũng làm cho các đối tượng scandir(path='.') -> generator of DirEntry objects1 có thể mở rộng hơn và chứng minh trong tương lai khi các hệ điều hành thêm chức năng và chúng tôi muốn đưa vào điều này vào scandir(path='.') -> generator of DirEntry objects1. Xem thêm một số cuộc thảo luận trước đây:
Trả về các giá trị bị quá tải các đối tượng Stat_ResultMột cách khác được thảo luận là làm cho các giá trị trả về được quá tải các đối tượng 8 với các thuộc tính def subdirs(path): """Yield directory names not starting with '.' under given path.""" for entry in os.scandir(path): if not entry.name.startswith('.') and entry.is_dir(): yield entry.name0 và 9. Tuy nhiên, ngoài việc này là một loại quá tải kỳ lạ (và căng thẳng!)Trả về các giá trị là các đối tượng pathlib.pathVới mô -đun thư viện tiêu chuẩn mới của Antoine Pitrou, def get_tree_size(path): """Return total size of files in path and subdirs. If is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 for entry in os.scandir(path): try: is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: total += get_tree_size(entry.path) else: try: total += entry.stat(follow_symlinks=False).st_size except OSError as error: print('Error calling stat():', error, file=sys.stderr) return total6, lúc đầu có vẻ như là một ý tưởng tuyệt vời cho 2 để trả về các trường hợp os.walk() 8. Tuy nhiên, các chức năng ____ 98 16 và 3 rõ ràng không được lưu trữ, trong khi 6 phải lưu trữ chúng theo thiết kế, bởi vì nó (thường) trả về các giá trị từ cuộc gọi hệ thống lặp thư mục ban đầu.Và nếu các trường hợp Guido Van Rossum đã từ chối rõ ràng Có thể cải thiệnCó nhiều cải tiến có thể mà người ta có thể thực hiện để Scandir, nhưng đây là một danh sách ngắn của một số tác giả PEP này có trong tâm trí:
Thảo luận trước
Bản quyềnTài liệu này đã được đặt trong phạm vi công cộng. |