使用Python将csv转换为固定宽度文件

Tha*_*vio 1 python csv fixed-width python-3.x

如何将 CSV 转换为固定宽度文件格式。

import csv
with open('C:\\Users\\thara.savio\\Downloads\\Sacramentorealestatetransactions.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        print('     '.join(row))
Run Code Online (Sandbox Code Playgroud)

它转换为以制表符作为分隔符的文本文件,而不是固定宽度格式。

下面是我得到的结果。

3526 HIGH ST     SACRAMENTO     95838     CA     2     1     836     Residential     Wed May 21 00:00:00 EDT 2008     59222     38.631913     -121.434879
51 OMAHA CT     SACRAMENTO     95823     CA     3     1     1167     Residential     Wed May 21 00:00:00 EDT 2008     68212     38.478902     -121.431028
2796 BRANCH ST     SACRAMENTO     95815     CA     2     1     796     Residential     Wed May 21 00:00:00 EDT 2008     68880     38.618305     -121.443839
2805 JANETTE WAY     SACRAMENTO     95815     CA     2     1     852     Residential     Wed May 21 00:00:00 EDT 2008     69307     38.616835     -121.439146
6001 MCMAHON DR     SACRAMENTO     95824     CA     2     1     797     Residential     Wed May 21 00:00:00 EDT 2008     81900     38.51947     -121.435768
5828 PEPPERMILL CT     SACRAMENTO     95841     CA     3     1     1122     
Run Code Online (Sandbox Code Playgroud)

Pat*_*ner 5

您可以预处理数据以获得每列的最大宽度并使用字符串格式迷你语言编写文件:

data = """3526 HIGH ST, SACRAMENTO, 95838, CA, 2, 1, 836, Residential, Wed May 21 00:00:00 EDT 2008, 59222, 38.631913, -121.434879
51 OMAHA CT, SACRAMENTO, 95823, CA, 3, 1, 1167, Residential, Wed May 21 00:00:00 EDT 2008, 68212, 38.478902, -121.431028
2796 BRANCH ST, SACRAMENTO, 95815, CA, 2, 1, 796, Residential, Wed May 21 00:00:00 EDT 2008, 68880, 38.618305, -121.443839
2805 JANETTE WAY, SACRAMENTO, 95815, CA, 2, 1, 852, Residential, Wed May 21 00:00:00 EDT 2008, 69307, 38.616835, -121.439146
6001 MCMAHON DR, SACRAMENTO, 95824, CA, 2, 1, 797, Residential, Wed May 21 00:00:00 EDT 2008, 81900, 38.51947, -121.435768"""

# max-width per column, column == key, width == value
w = {}
lines = data.splitlines()
for line in lines:
    for col_nr, col in enumerate(line.strip().split(",")):
        w[col_nr] = max( w.get(col_nr,0), len(col))

# w == {0: 16, 1: 11,  2:  6, 3: 3,   4:  2,   5: 2, 
#       6:  5, 7: 12,  8: 29, 9: 6,  10: 10,  11: 12}

# write file
with open("file.txt","w") as f:
    for line in lines:
        for col_nr, col in enumerate(line.strip().split(",")):
            # the :<{w[col_nr]+5}} - part is left-adjusting to certain width 
            f.write(f"{col:<{w[col_nr]+5}}") # 5 additional spaces
        f.write("\n")

with open("file.txt","r") as f:
    print(f.read())
Run Code Online (Sandbox Code Playgroud)

输出:

3526 HIGH ST          SACRAMENTO      95838      CA      2      1      836       Residential      Wed May 21 00:00:00 EDT 2008      59222      38.631913      -121.434879     
51 OMAHA CT           SACRAMENTO      95823      CA      3      1      1167      Residential      Wed May 21 00:00:00 EDT 2008      68212      38.478902      -121.431028     
2796 BRANCH ST        SACRAMENTO      95815      CA      2      1      796       Residential      Wed May 21 00:00:00 EDT 2008      68880      38.618305      -121.443839     
2805 JANETTE WAY      SACRAMENTO      95815      CA      2      1      852       Residential      Wed May 21 00:00:00 EDT 2008      69307      38.616835      -121.439146     
6001 MCMAHON DR       SACRAMENTO      95824      CA      2      1      797       Residential      Wed May 21 00:00:00 EDT 2008      81900      38.51947       -121.435768     
Run Code Online (Sandbox Code Playgroud)