编写一个show-tree.py脚本,将文件路径作为其输入: python ./show-tree.py ./path/to/main_dir 如果这个路径指向一个文件,程序应该抛出一个错误。如果这个路径指向指向一个目录,该程序应该输出该目录的文件树: 1. 每个文件和目录都在自己的行上输出; 2. 目录内容的输出相对于水平方向移位4个字符; 当第一个文件/目录被输出时,这些字符必须是`--(+空格); 当随后的文件/目录被输出时|--(+空格); 当已经输出这些文件/目录的内容时,这些字符应该是|-- (+ 3个空格)。 为目录和文件添加标签(分别为后缀(d)和(f))。除了接受输入目录的路径外,还接受输入标志。该脚本必须 识别两种类型的标志: -s和-l。使用-h标志可以将其转换为方便的计量单位
时间: 2023-06-25 16:03:30 浏览: 88
以下是一个可能的实现,它基于Python 3,并使用了os和argparse模块:
```python
import os
import argparse
def show_tree(path, level=0, size_unit='B'):
if not os.path.exists(path):
print(f"Error: {path} does not exist!")
return
if os.path.isfile(path):
print(f"Error: {path} is not a directory!")
return
files = os.listdir(path)
for i, file in enumerate(sorted(files)):
prefix = "-- " if i == 0 else "|-- "
if i == len(files) - 1:
sub_prefix = " " if level == 0 else " " * (level * 4) + " "
new_level = level
else:
sub_prefix = "| " if level == 0 else "| " + " " * ((level - 1) * 4)
new_level = level + 1
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
print(f"{prefix}{file}{os.path.sep}(d)")
show_tree(file_path, level=new_level, size_unit=size_unit)
else:
size = os.path.getsize(file_path)
size_str = format_size(size, unit=size_unit)
print(f"{prefix}{file}{os.path.sep}(f) ({size_str})")
def format_size(size, unit='B'):
units = {'B': 0, 'K': 1, 'M': 2, 'G': 3, 'T': 4}
while size >= 1024 and unit != 'B':
size /= 1024
unit = [k for k, v in units.items() if v == units[unit] + 1][0]
return f"{size:.2f} {unit}"
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Show directory tree')
parser.add_argument('path', type=str, help='Path to the main directory')
parser.add_argument('-s', action='store_true', help='Display sizes in human-readable format')
parser.add_argument('-l', action='store_true', help='Follow symlinks')
args = parser.parse_args()
size_unit = 'B' if not args.s else 'K'
follow_links = args.l
if follow_links:
show_tree(args.path, size_unit=size_unit)
else:
with os.scandir(args.path) as directory:
for entry in directory:
if entry.is_symlink():
continue
show_tree(entry.path, size_unit=size_unit)
```
使用示例:
```
python show-tree.py ./path/to/main_dir -s
```
这将显示以 "./path/to/main_dir" 为根目录的文件树,并在文件大小中使用人类可读格式。
阅读全文