如何使用Python(而不是任何外部工具)漂亮地打印CSV文件?
例如,我有这个CSV文件:
title1|title2|title3|title4
datalongdata|datalongdata|data|data
data|data|data|datalongdatadatalongdatadatalongdatadatalongdatadatalongdata
data|data'data|dat
我想将其转换为可视化的表格。例如,类似这样的内容:
+ --------------------------------------------------------------------------------------------------- +
| title1 | title2 | title3 | title4 |
+ --------------------------------------------------------------------------------------------------- +
| datalongdata | datalongdata | data | data |
| | | | |
| data | data | data | datalongdatadatalongdatadatalongdatadatalongdatadatalongdata |
| data | data'data | dat | |
+ --------------------------------------------------------------------------------------------------- +
pretty.pretty_file( filename , options )**
读取CSV文件并将数据作为表格直观地打印到新文件中。 filename ,是给定的CSV文件。可选的** options
关键字参数是Python标准库csv模块的方言和格式参数以及以下列表的并集:
例:
import pretty_csv
pretty_csv.pretty_file("test.csv", header=False, border=False, delimiter="|")
Python 3:
这是一个Python 2实现。对于Python 3,您必须将两次出现的行更改为open(filename, "rb") as input:
,open(filename, "r", newline="") as input:
因为csv.reader
在Python
3中希望以文本模式打开文件。
import csv
import os
def pretty_file(filename, **options):
"""
@summary:
Reads a CSV file and prints visually the data as table to a new file.
@param filename:
is the path to the given CSV file.
@param **options:
the union of Python's Standard Library csv module Dialects and Formatting Parameters and the following list:
@param new_delimiter:
the new column separator (default " | ")
@param border:
boolean value if you want to print the border of the table (default True)
@param border_vertical_left:
the left border of the table (default "| ")
@param border_vertical_right:
the right border of the table (default " |")
@param border_horizontal:
the top and bottom border of the table (default "-")
@param border_corner_tl:
the top-left corner of the table (default "+ ")
@param border_corner_tr:
the top-right corner of the table (default " +")
@param border_corner_bl:
the bottom-left corner of the table (default same as border_corner_tl)
@param border_corner_br:
the bottom-right corner of the table (default same as border_corner_tr)
@param header:
boolean value if the first row is a table header (default True)
@param border_header_separator:
the border between the header and the table (default same as border_horizontal)
@param border_header_left:
the left border of the table header (default same as border_corner_tl)
@param border_header_right:
the right border of the table header (default same as border_corner_tr)
@param newline:
defines how the rows of the table will be separated (default "\n")
@param new_filename:
the new file's filename (*default* "/new_" + filename)
"""
#function specific options
new_delimiter = options.pop("new_delimiter", " | ")
border = options.pop("border", True)
border_vertical_left = options.pop("border_vertical_left", "| ")
border_vertical_right = options.pop("border_vertical_right", " |")
border_horizontal = options.pop("border_horizontal", "-")
border_corner_tl = options.pop("border_corner_tl", "+ ")
border_corner_tr = options.pop("border_corner_tr", " +")
border_corner_bl = options.pop("border_corner_bl", border_corner_tl)
border_corner_br = options.pop("border_corner_br", border_corner_tr)
header = options.pop("header", True)
border_header_separator = options.pop("border_header_separator", border_horizontal)
border_header_left = options.pop("border_header_left", border_corner_tl)
border_header_right = options.pop("border_header_right", border_corner_tr)
newline = options.pop("newline", "\n")
file_path = filename.split(os.sep)
old_filename = file_path[-1]
new_filename = options.pop("new_filename", "new_" + old_filename)
column_max_width = {} #key:column number, the max width of each column
num_rows = 0 #the number of rows
with open(filename, "rb") as input: #parse the file and determine the width of each column
reader=csv.reader(input, **options)
for row in reader:
num_rows += 1
for col_number, column in enumerate(row):
width = len(column)
try:
if width > column_max_width[col_number]:
column_max_width[col_number] = width
except KeyError:
column_max_width[col_number] = width
max_columns = max(column_max_width.keys()) + 1 #the max number of columns (having rows with different number of columns is no problem)
if max_columns > 1:
total_length = sum(column_max_width.values()) + len(new_delimiter) * (max_columns - 1)
left = border_vertical_left if border is True else ""
right = border_vertical_right if border is True else ""
left_header = border_header_left if border is True else ""
right_header = border_header_right if border is True else ""
with open(filename, "rb") as input:
reader=csv.reader(input, **options)
with open(new_filename, "w") as output:
for row_number, row in enumerate(reader):
max_index = len(row) - 1
for index in range(max_columns):
if index > max_index:
row.append(' ' * column_max_width[index]) #append empty columns
else:
diff = column_max_width[index] - len(row[index])
row[index] = row[index] + ' ' * diff #append spaces to fit the max width
if row_number==0 and border is True: #draw top border
output.write(border_corner_tl + border_horizontal * total_length + border_corner_tr + newline)
output.write(left + new_delimiter.join(row) + right + newline) #print the new row
if row_number==0 and header is True: #draw header's separator
output.write(left_header + border_header_separator * total_length + right_header + newline)
if row_number==num_rows-1 and border is True: #draw bottom border
output.write(border_corner_bl + border_horizontal * total_length + border_corner_br)
问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy
问题内容: 如果有人对JSON的打印非常了解,那么我将不胜感激! 我正在使用以下功能将JSON字符串移动到文件中,以将复杂的python字符串转换为JSON格式: 问题是我遇到了方括号的语法错误,因为这对我来说是个新话题,我不知道该如何解决。我需要的JSON格式如下: 我正在使用Google Visualization API,您可能对此比较熟悉,但是我需要动态图。上面的代码是API创建图形所需的
问题内容: 我有一个带有JSON元素序列的文件: 是否有一个Shell脚本来格式化JSON以以可读形式显示文件内容? 我看过这篇文章,我认为这是一个很好的起点! 我的想法是迭代文件中的行,然后: 还有其他想法吗? 问题答案: 将文件中的结果通过管道传输到python json工具2.6及更高版本
问题内容: 有人知道在Go中漂亮地打印JSON输出的简单方法吗? 库存的 http://golang.org/pkg/encoding/json/ 软件包似乎不包含此功能 (编辑:确实如此,请参见接受的答案),而且快速的Google并没有发现任何明显的问题。 我正在寻找的用途既可以打印出JSON 的结果,又可以从任何地方格式化一个充满JSON的字符串,因此出于调试目的而更易于阅读。 问题答案: 通
问题内容: 如何在Python中打印深度约为4的字典?我尝试使用进行漂亮的打印,但是没有用: 我只是想为每个嵌套添加一个缩进(),以便获得如下内容: 等等 我怎样才能做到这一点? 问题答案: 我不确定您希望格式看起来如何,但是可以从这样的函数开始:
问题内容: 这似乎是一个已解决的问题,但我无法找到解决方案。 基本上,我读取了一个JSON文件,更改了密钥,然后将新的JSON写回到同一文件。都可以,但是我松了JSON格式,所以,而不是: 我懂了 Node.js中是否可以将格式良好的JSON写入文件? 问题答案: 的第三个参数定义用于漂亮打印的空白插入。它可以是字符串或数字(空格数)。Node可以使用写入您的文件系统。例: 请参阅MDN上的JSO