Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何在前两行打印行之间添加一行破折号?_Python_Python 3.x - Fatal编程技术网

在Python中,如何在前两行打印行之间添加一行破折号?

在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:

我正在尝试从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:
            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