@@ -1595,18 +1595,14 @@ def tree(
15951595 Returns
15961596 -------
15971597 str: A string representing the tree structure.
1598-
1598+
15991599 Example
16001600 -------
1601- >>> tree = fs.tree(path='/start/folder', display_size=True)
1601+ >>> from fsspec import filesystem
1602+
1603+ >>> fs = filesystem('ftp', host='test.rebex.net', user='demo', password='password')
1604+ >>> tree = fs.tree(display_size=True, recursion_limit=3, indent_size=8, max_display=10)
16021605 >>> print(tree)
1603-
1604- /start/folder
1605- ├── folder1
1606- │ ├── file1.txt (1.234MB)
1607- │ └── file2.txt (0.567MB)
1608- └── folder2
1609- └── file3.txt (2.345MB)
16101606 """
16111607 def format_bytes (n : int ) -> str :
16121608 """Format bytes as text."""
@@ -1622,10 +1618,10 @@ def format_bytes(n: int) -> str:
16221618 return f"{ n } B"
16231619
16241620 result = []
1625-
1621+
16261622 if first :
16271623 result .append (path )
1628-
1624+
16291625 if recursion_limit :
16301626 indent = " " * indent_size
16311627 contents = self .ls (path , detail = True )
@@ -1646,7 +1642,24 @@ def format_bytes(n: int) -> str:
16461642 new_prefix = prefix + (indent if is_last_item else "│" + " " * (indent_size - 1 ))
16471643
16481644 name = os .path .basename (item .get ('name' , '' ))
1649- size = f" ({ format_bytes (item .get ('size' , 0 ))} )" if display_size and item .get ('type' ) == 'file' else ""
1645+
1646+ if display_size and item .get ('type' ) == 'directory' :
1647+ sub_contents = self .ls (item .get ('name' , '' ), detail = True )
1648+ num_files = sum (1 for sub_item in sub_contents if sub_item .get ('type' ) == 'file' )
1649+ num_folders = sum (1 for sub_item in sub_contents if sub_item .get ('type' ) == 'directory' )
1650+
1651+ if num_files == 0 and num_folders == 0 :
1652+ size = " (empty folder)"
1653+ elif num_files == 0 :
1654+ size = f" ({ num_folders } subfolder{ 's' if num_folders > 1 else '' } )"
1655+ elif num_folders == 0 :
1656+ size = f" ({ num_files } file{ 's' if num_files > 1 else '' } )"
1657+ else :
1658+ size = f" ({ num_files } file{ 's' if num_files > 1 else '' } , { num_folders } subfolder{ 's' if num_folders > 1 else '' } )"
1659+ elif display_size and item .get ('type' ) == 'file' :
1660+ size = f" ({ format_bytes (item .get ('size' , 0 ))} )"
1661+ else :
1662+ size = ""
16501663
16511664 result .append (f"{ prefix } { branch } { name } { size } " )
16521665
@@ -1666,7 +1679,7 @@ def format_bytes(n: int) -> str:
16661679
16671680 if remaining_count > 0 :
16681681 more_message = f"{ remaining_count } more item(s) not displayed."
1669- result .append (f"{ prefix } { '└── ' if is_last else '├── ' } { more_message } " )
1682+ result .append (f"{ prefix } { "└" + ( '─' * ( indent_size - 2 )) } { more_message } " )
16701683
16711684 return "\n " .join ((_ for _ in result if _ ))
16721685
0 commit comments