Отдельный ответ - этот код форматирует «четко определенный» CSV
tata,ta,for,kattatom
1234,45,79,45
1234,45,79,45
в «utf8-art»:
┌────┬──┬───┬────────┐
│tata│ta│for│kattatom│
├────┼──┼───┼────────┤
│1234│45│79 │45 │
├────┼──┼───┼────────┤
│1234│45│79 │45 │
└────┴──┴───┴────────┘
UTF8-art добавляется кфайл output.txt
.
import csv
def create_table(file_name):
"""Takes a file_name to a csv. Produces utf8-art of the data.
Missing columns will be assumed to miss at end and replaced
by empty columns."""
# mostly untested code - works for the 2 examples mentioned here
with open(file_name,"r") as f:
reader = csv.reader(f)
w = get_widths(reader)
row_count = w["last"]
del w["last"]
f.seek(0)
return create_table_string(reader, w, row_count)
def get_widths(csv_reader):
widths = {}
row_count = 0
for row in csv_reader:
if row: # ignore empties
row_count += 1
for idx,data in enumerate(row):
widths[idx] = max(widths.get(idx,0),len(data))
widths["last"] = row_count
return widths
# supply other set of lines if you like
deco = {k:v for k,v in zip("hv012345678","─│┌┬┐├┼┤└┴┘")}
def base_row(widths, row, max_key, _v, _h, _l, _m, _r):
decoration = []
text_data = []
decoration.append(_l + _h*widths[0])
for i in range(1,max_key):
decoration.append(_m + _h*widths[i])
decoration.append(_m + _h*widths[max_key] + _r)
if row:
for i,data in enumerate(row):
text_data.append(_v + "{:<{}}".format(data, widths[i]))
for empty in range(i+1,max_key+1):
text_data.append(_v + " "*widths[empty])
text_data[-1]+=_v
return [decoration, text_data]
def get_first_row(widths,row):
return base_row(widths, row, max(widths.keys()), deco["v"], deco["h"],
deco["0"], deco["1"], deco["2"])
def get_middle_row(widths,row):
return base_row(widths, row, max(widths.keys()), deco["v"], deco["h"],
deco["3"], deco["4"], deco["5"])
def get_last_row(widths):
decoration, _ = base_row(widths, [], max(widths.keys()), deco["v"],
deco["h"], deco["6"], deco["7"], deco["8"])
return [decoration]
def create_table_string(reader, widths, row_count):
output = []
r = 0
for row in reader:
if row:
r += 1
if r==1:
output.extend(get_first_row(widths, row))
else:
output.extend(get_middle_row(widths, row))
output.extend( get_last_row(widths))
return output
Использование:
#create sample csv
with open("data.csv","w") as f:
f.write("""tata,ta,for,kattatom
1234,45,79,45
1234,45,79,45""")
# open outputfile for append
with open("output.txt", "a", encoding="UTF8") as output:
output.write("\n" + "-" * 40 + "\n\n")
# get utf8 art
for line in create_table("data.csv"):
output.write(''.join(line)+"\n")
Ввод csv:
tata,ta,for,kattatom
1234,45,79,45
1234,45,79,45
затем:
tata,ta,for,kattatom
1234,45,79,45,8,0
1234,45,79,45
Вывод:
┌────┬──┬───┬────────┐
│tata│ta│for│kattatom│
├────┼──┼───┼────────┤
│1234│45│79 │45 │
├────┼──┼───┼────────┤
│1234│45│79 │45 │
└────┴──┴───┴────────┘
----------------------------------------
┌────┬──┬───┬────────┬─┬─┐
│tata│ta│for│kattatom│ │ │
├────┼──┼───┼────────┼─┼─┤
│1234│45│79 │45 │8│0│
├────┼──┼───┼────────┼─┼─┤
│1234│45│79 │45 │ │ │
└────┴──┴───┴────────┴─┴─┘