是否可以使用 os.listdir() 打印列式输出?

问题描述 投票:0回答:5

我希望使用 os.listdir 创建两列。代码是标准的listdir()。

for f in os.listdir(os.curdir):
                print f

输出如下:

file1
file2
file3
file4

但我正在努力实现:

file1    file3
file2    file4

使用 os.listdir() 可以(轻松)实现吗?

python python-2.7 listdir
5个回答
2
投票

os.listdir
只返回一个列表,不会像
ls -C2
那样很好地打印它(请注意,如果你的系统中有
ls
,你不需要Python)

您可以这样操作 2 列:

import os,itertools

dl=os.listdir(".")

for t in itertools.zip_longest(dl[::2],dl[1::2],fillvalue=""):
    print("{:<20} {:<20}".format(*t))

这会将值交错在一起(使用

zip_longest
以避免忘记奇数)并为每个值使用 20 个空格进行格式化。

任意数量列的一般情况可能是:

import os,itertools

dl=os.listdir(".")

ncols = 3

for t in itertools.zip_longest(*(dl[i::ncols] for i in range(ncols)),fillvalue=""):
    print(("{:<20}"*ncols).format(*t))

(生成

ncols
移位列表,交错它们,并相应地生成格式)


0
投票

不,

os.listdir()
不可能。您可能必须考虑其他选项,例如如何更好地打印列表?.


0
投票

您可以使用此

anwser
中的功能pairwise

轻松完成此操作
def pairwise(iterable):
    a = iter(iterable)
    return izip(a, a)

for f1, f2 in pairwise(os.listdir(os.curdir)):
    print f1 + '\t' + f2

0
投票

试试这个,

for i,k in zip(os.listdir(os.curdir)[0::2], os.listdir(os.curdir)[1::2]): print i,k

0
投票

这将在列中打印

os.listdir()
的输出,并通过分割环境变量
COLUMNS
给定的终端宽度来计算列数。

结果与

ls
的常规输出类似,并且适用于 iPython 和 Jupyter Notebooks。

import os
import shutil

def list_files(directory):
    files = sorted(os.listdir(directory))
    max_filename_length = max(len(file) for file in files)  # Get the maximum length of filenames

    terminal_width = shutil.get_terminal_size().columns # int(os.getenv('COLUMNS', 80)) 
    min_column_width = max_filename_length + 2  # minimum width for each column

    columns = max(1, terminal_width // min_column_width)  # adjust the number of columns based on terminal width
    rows = -(-len(files) // columns)  # ceiling division to get # of rows (same as ceil(len(files) / columns))

    for i in range(rows):
        row = ''
        for j in range(columns):
            index = j * rows + i
            if index < len(files):
                filename = files[index]
                row += filename.ljust(max_filename_length + 2)  # adjust spaces for alignment
        print(row)

!rm -rf test;mkdir test; for i in {1..100..10};do touch test/file$i;done;touch test/file22looooongfile

# Usage
#list_files(dir_name)
list_files('test')
# Output:
# file1               file21              file31              file51               file71              file91              
# file11              file22looooongfile  file41              file61               file81   

与 IPython 中

ls
的输出相比:

!ls test
# file1         file21              file31          file51          file71          file91
# file11        file22looooongfile  file41          file61          file81

Jupyter Notebooks 中的

ls
命令似乎通过使每列的宽度适应其最大元素的宽度来更好地打包列。

© www.soinside.com 2019 - 2024. All rights reserved.