在Python中,如何在前两行打印行之间添加一行破折号?
我正在尝试从csv文件在控制台中创建一个表。为了使输出看起来更像一个表,我想在第二行添加一行破折号,以拆分标题和主表内容 这是我目前的代码:在Python中,如何在前两行打印行之间添加一行破折号?,python,python-3.x,Python,Python 3.x,我正在尝试从csv文件在控制台中创建一个表。为了使输出看起来更像一个表,我想在第二行添加一行破折号,以拆分标题和主表内容 这是我目前的代码: import csv with open('filename.csv', mode='r') as csv_file: csv_reader = csv.reader(csv_file) line_count = 0 for row in csv_reader: if line_count == 0:
import csv
with open('filename.csv', mode='r') as csv_file:
csv_reader = csv.reader(csv_file)
line_count = 0
for row in csv_reader:
if line_count == 0:
print("|",row[0]," "*(20-len(row[0])), "|",
row[1], " " * (15 - len(row[1])), "|",
row[2], " " * (20 - len(row[2])), "|",
row[3], " " * (5 - len(row[3])), "|")
这是输出:
| Track | Artist | Album | Time |
| Songname 1 | Artist 1 | Album 1 | 7:15 |
| Songname 1 | Artist 2 | Album 2 | 6:27 |
| Songname 1 | Artist 3 | Album 3 | 5:24 |
| Songname 1 | Artist 4 | Album 4 | 2:50 |
| Songname 1 | Artist 5 | Album 5 | 4:39 |
| Songname 1 | Artist 6 | Album 6 | 5:11 |
| Songname 1 | Artist 7 | Album 7 | 2:56 |
| Songname 1 | Artist 8 | Album 8 | 4:29 |
| Songname 1 | Artist 9 | Album 9 | 3:17 |
| Songname 1 | Artist 10 | Album 10 | 3:04 |
Process finished with exit code 0
这就是我想要实现的输出:
-----------------------------------------------------------------------
| Track | Artist | Album | Time |
-----------------------------------------------------------------------
| Songname 1 | Artist 1 | Album 1 | 7:15 |
| Songname 1 | Artist 2 | Album 2 | 6:27 |
| Songname 1 | Artist 3 | Album 3 | 5:24 |
| Songname 1 | Artist 4 | Album 4 | 2:50 |
| Songname 1 | Artist 5 | Album 5 | 4:39 |
| Songname 1 | Artist 6 | Album 6 | 5:11 |
| Songname 1 | Artist 7 | Album 7 | 2:56 |
| Songname 1 | Artist 8 | Album 8 | 4:29 |
| Songname 1 | Artist 9 | Album 9 | 3:17 |
| Songname 1 | Artist 10 | Album 10 | 3:04 |
-----------------------------------------------------------------------
我相信您试图实现的是,表的标题(即列名)应该分开显示。如果我理解正确,那么我建议为什么不使用pandas.read_csv导入您的csv文件。它自己标识标题,如果不是,那么它会将其作为一个参数,说明如何选择一行作为标题 查看文档: 此外,如果您只需要破折号或您提到的方式,那么我相信您必须在打印第一行(其中包含列名)后添加打印语句,然后再添加一个破折号打印语句,然后循环其他信息,最后再打印更多破折号。所以,是的,这是一种手动方式 编辑: 既然您要求手动操作,代码如下:
import csv
with open('stacko.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter='|')
line_count = 0
print("-----------------------------------------------------------------------------------")
for row in csv_reader:
if line_count == 0:
print("|",row[1], " " * (5 - len(row[1])), "|",
row[2], " " * (10 - len(row[2])), "|",
row[3], " " * (5 - len(row[3])), "|",
row[4], " " * (5 - len(row[4])), "|")
print("-----------------------------------------------------------------------------------")
line_count=1
else:
print("|",row[1], " " * (5 - len(row[1])), "|",
row[2], " " * (10 - len(row[2])), "|",
row[3], " " * (5 - len(row[3])), "|",
row[4], " " * (5 - len(row[4])), "|")
print("-----------------------------------------------------------------------------------")
输出:
-----------------------------------------------------------------------------------
|曲目|艺术家|专辑|时间|
-----------------------------------------------------------------------------------
|歌曲名称1 |艺术家1 |专辑1 | 7:15|
|歌曲名称1 |艺术家2 |专辑2 | 6:27|
|歌曲名称1 |艺术家3 |专辑3 | 5:24|
|歌曲名称1 |艺术家4 |专辑4 | 2:50|
|歌曲名称1 |艺术家5 |专辑5 | 4:39|
|歌曲名1 |艺术家6 |专辑6 | 5:11|
|歌曲名称1 |艺术家7 |专辑7 | 2:56|
|歌曲名称1 |艺术家8 |专辑8 | 4:29|
|歌曲名1 |艺术家9 |专辑9 | 3:17|
|歌曲名称1 |艺术家10 |专辑10 | 3:04|
-----------------------------------------------------------------------------------
我相信您试图实现的是,表的标题(即列名)应该分开显示。如果我理解正确,那么我建议为什么不使用pandas.read_csv导入您的csv文件。它自己标识标题,如果不是,那么它会将其作为一个参数,说明如何选择一行作为标题
查看文档:
此外,如果您只需要破折号或您提到的方式,那么我相信您必须在打印第一行(其中包含列名)后添加打印语句,然后再添加一个破折号打印语句,然后循环其他信息,最后再打印更多破折号。所以,是的,这是一种手动方式
编辑:
既然您要求手动操作,代码如下:
import csv
with open('stacko.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter='|')
line_count = 0
print("-----------------------------------------------------------------------------------")
for row in csv_reader:
if line_count == 0:
print("|",row[1], " " * (5 - len(row[1])), "|",
row[2], " " * (10 - len(row[2])), "|",
row[3], " " * (5 - len(row[3])), "|",
row[4], " " * (5 - len(row[4])), "|")
print("-----------------------------------------------------------------------------------")
line_count=1
else:
print("|",row[1], " " * (5 - len(row[1])), "|",
row[2], " " * (10 - len(row[2])), "|",
row[3], " " * (5 - len(row[3])), "|",
row[4], " " * (5 - len(row[4])), "|")
print("-----------------------------------------------------------------------------------")
输出:
-----------------------------------------------------------------------------------
|曲目|艺术家|专辑|时间|
-----------------------------------------------------------------------------------
|歌曲名称1 |艺术家1 |专辑1 | 7:15|
|歌曲名称1 |艺术家2 |专辑2 | 6:27|
|歌曲名称1 |艺术家3 |专辑3 | 5:24|
|歌曲名称1 |艺术家4 |专辑4 | 2:50|
|歌曲名称1 |艺术家5 |专辑5 | 4:39|
|歌曲名1 |艺术家6 |专辑6 | 5:11|
|歌曲名称1 |艺术家7 |专辑7 | 2:56|
|歌曲名称1 |艺术家8 |专辑8 | 4:29|
|歌曲名1 |艺术家9 |专辑9 | 3:17|
|歌曲名称1 |艺术家10 |专辑10 | 3:04|
-----------------------------------------------------------------------------------
您可以使用以下工具使代码更简单:
如果要省略行时间,并且使用自适应宽度而不使用硬编码长度,则标题提取的替代解决方案: 演示文件:
t = """Track,Artist,Album,Time
Very Long Songname 1,Artist 1,Album 1,7:15
Songname 1,Artist 2,Album 2 title with epic proportions,6:27
"""
with open("t.txt","w") as w:
w.write(t)
代码:
import csv
def get_format_string(w):
s = '|'+'|'.join(" {{:<{}}} ".format(l) for _,l in sorted(w.items()))+'|'
return s.format
def get_widths(reader,filehandle):
"""Calculate maximum widths of columns. Rewinds filehandle to seek(0)."""
widths = {}
for row in reader:
for i,c in enumerate(row):
widths[i] = max(widths.get(i,0), len(c))
# rewind
filehandle.seek(0)
return widths
with open('t.txt', mode='r') as csv_file:
csv_reader = csv.reader(csv_file)
fmt = get_format_string(get_widths(csv_reader,csv_file))
header = fmt(*(next(csv_reader)))
w = len(header)
print("-"*w)
print(header)
print("-"*w)
# deal with the rest of the data
for row in csv_reader:
print(fmt(*row))
# and the last line
print("-"*w)
您可以使用以下工具使代码更加容易:
如果要省略行时间,并且使用自适应宽度而不使用硬编码长度,则标题提取的替代解决方案: 演示文件:
t = """Track,Artist,Album,Time
Very Long Songname 1,Artist 1,Album 1,7:15
Songname 1,Artist 2,Album 2 title with epic proportions,6:27
"""
with open("t.txt","w") as w:
w.write(t)
代码:
import csv
def get_format_string(w):
s = '|'+'|'.join(" {{:<{}}} ".format(l) for _,l in sorted(w.items()))+'|'
return s.format
def get_widths(reader,filehandle):
"""Calculate maximum widths of columns. Rewinds filehandle to seek(0)."""
widths = {}
for row in reader:
for i,c in enumerate(row):
widths[i] = max(widths.get(i,0), len(c))
# rewind
filehandle.seek(0)
return widths
with open('t.txt', mode='r') as csv_file:
csv_reader = csv.reader(csv_file)
fmt = get_format_string(get_widths(csv_reader,csv_file))
header = fmt(*(next(csv_reader)))
w = len(header)
print("-"*w)
print(header)
print("-"*w)
# deal with the rest of the data
for row in csv_reader:
print(fmt(*row))
# and the last line
print("-"*w)
您是否尝试过自己添加行?您可能对一些“漂亮打印”类型库感兴趣,例如,etc@depperm你的意思是直接将这些行添加到csv文件中吗?我是说你自己有没有尝试将这些行添加到输出中?@CoryKramer谢谢你的反馈,我应该在原始帖子中提到,如果可能的话,我希望避免使用类型库。您是否尝试过自己添加行?您可能对一些“漂亮打印”类型库感兴趣,例如, etc@depperm你的意思是直接将这些行添加到csv文件中吗?我是说你自己有没有尝试将这些行添加到输出中?@CoryKramer谢谢你的反馈,我应该在原始帖子中提到,如果可能的话,我希望避免使用类型库。在每个迭代中检查
如果idx==0
似乎是浪费。在第二个示例中,您不需要idx
或枚举
。此外,您还可以将该格式字符串拉入一个单独的变量,如fmt=“|{:唯一的pr