让Python输出带有空格填充、固定宽度、但以逗号分隔的列的.csv?

ryhaxcpt  于 2023-03-27  发布在  Python
关注(0)|答案(1)|浏览(179)

假设我有CSV数据如下所示;我们将其命名为original.csv

name,value1,value2
firstname,34326408129478932874,553
secondname_a_very_long_one,65,123987
thirdname_medium,9686509933423,33

基本上,它要么是单个单词文本(没有空格分隔,所以不需要引号),要么是数字(这里是整数,但可以是小数或科学1 e-5符号的浮点数)-并且不期望逗号可能出现在某处(除了作为分隔符之外),所以也不需要对逗号的引号进行特殊处理。
因此,为了减轻我的眼睛紧张,当我在文本编辑器中查看此.csv文件,我想格式化它与固定宽度-空间填充(左或右填充选择每列,并分别为标题行);请注意,该文件仍然是逗号分隔的数据格式,固定的宽度只是为了在编辑器中查看-这就是我希望它看起来像,让我们称之为tmpfw.csv

name                      , value1              , value2
firstname                 , 34326408129478932874, 553
secondname_a_very_long_one,                   65, 123987
thirdname_medium          ,        9686509933423, 33

这里,标题行全部左对齐(右填充空格);列namevalue2也是左对齐的(用空格右填充);并且列value1是右对齐的(右填充空格)。根据该列中数据的最大字符串长度来调整列的大小(以字符为单位);并且在逗号之后有一个额外的空格作为可视分隔符。
当然,如果我想在Python中正确使用这些数据,我必须首先“剥离”它-但我不介意,因为正如我提到的,数据是这样的,我不必担心引用问题;下面是一个Python示例,说明如何使用tmpfw.csv-我们称之为test.py

import sys
import csv
import pprint

with open('tmpfw.csv', newline='') as csvfile:
  my_csv = csv.reader(csvfile)
  my_csv_list = list(my_csv)

my_csv_list_stripped = [list(map(str.strip, irow)) for irow in my_csv_list]

print("\nmy_csv_list:\n")
pprint.pprint( my_csv_list )
print("\nmy_csv_list_stripped:\n")
pprint.pprint( my_csv_list_stripped )

#print("\nreprint stripped as csv:\n")
#csvwriter = csv.writer(sys.stdout) # just print out to terminal
#csvwriter.writerows(my_csv_list_stripped)

这是我打印出来的:

$ python3 test.py

my_csv_list:

[['name                      ', ' value1              ', ' value2'],
 ['firstname                 ', ' 34326408129478932874', ' 553'],
 ['secondname_a_very_long_one', '                   65', ' 123987'],
 ['thirdname_medium          ', '        9686509933423', ' 33']]

my_csv_list_stripped:

[['name', 'value1', 'value2'],
 ['firstname', '34326408129478932874', '553'],
 ['secondname_a_very_long_one', '65', '123987'],
 ['thirdname_medium', '9686509933423', '33']]

我可以用这个作为基数,以后把数字转换成int-所以,我可以用这样一个固定宽度的csv,一切都很好……
所以,我的问题是:假设我有original.csv-在Python中获得“固定宽度格式”的tmpfw.csv的最简单方法是什么?csvpandas或其他库有导出这样的CSV格式的工具吗?

0vvn1miw

0vvn1miw1#

当然-计算每列的最大长度,然后在打印时相应地.ljust()它们:

import csv
import io

# pretend reading csv from file
csv_data = list(csv.reader(io.StringIO("""
name,value1,value2
firstname,34326408129478932874,553
secondname_a_very_long_one,65,123987
thirdname_medium,9686509933423,33
""".strip())))

n_cols = len(csv_data[0])
col_widths = [max(len(row[i]) for row in csv_data) for i in range(n_cols)]

for row in csv_data:
    print(', '.join(val.ljust(width) for val, width in zip(row, col_widths)))

这个打印出来

name                      , value1              , value2
firstname                 , 34326408129478932874, 553   
secondname_a_very_long_one, 65                  , 123987
thirdname_medium          , 9686509933423       , 33

当然你也可以打开一个文件,然后用print(..., file=...)代替。

相关问题