Code: Alles auswählen
#!/usr/bin/env python3
from itertools import zip_longest
from math import ceil
from shutil import get_terminal_size
class Column:
def __init__(self, strings, adjuster=str.ljust):
self.strings = strings
self.adjuster = adjuster
def __iter__(self):
width = self.get_width()
for string in self.strings:
yield self.adjuster(string, width)
def get_width(self):
return max(len(s) for s in self.strings)
class ColumnCalculator:
def __init__(self, strings, spacing):
self.strings = strings
self.spacing = spacing
def build_columns(self, max_columns):
if max_columns <= 0:
return []
num_lines = ceil(len(self.strings) / max_columns)
rng = range(0, len(self.strings), num_lines)
return [Column(self.strings[i:(i + num_lines)]) for i in rng]
def fits_in_line(self, columns, line_width):
total_column_widths = sum(col.get_width() for col in columns)
total_spacing = (len(columns) - 1) * self.spacing
total_width = total_column_widths + total_spacing + 1
return total_width <= line_width
def guess_columns(self, line_width=None):
if line_width is None:
line_width = get_terminal_size().columns
columns = self.build_columns(min(line_width, len(self.strings)))
while len(columns) > 1 and not self.fits_in_line(columns, line_width):
columns = self.build_columns(len(columns) - 1)
return columns
class View:
def __init__(self, strings, spacer, line_width):
self.strings = strings
self.spacer = spacer
self.line_width = line_width
def __str__(self):
return "\n".join(self.get_lines())
def get_columns(self):
calculator = ColumnCalculator(self.strings, len(self.spacer))
return calculator.guess_columns(self.line_width)
def get_lines(self):
lines = zip_longest(*self.get_columns(), fillvalue="")
return [self.spacer.join(line) for line in lines]
def columnize(items, spacer=" ", line_width=None):
strings = [str(item) for item in items]
return View(strings, spacer, line_width)
Code: Alles auswählen
from pathlib import Path
from anycol import columnize
filenames = Path().iterdir()
print(columnize(filenames, spacer=" | "))