Skip to main content
 首页 » 编程设计

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

2025年05月04日20unruledboy

如何将 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)) 

它转换为以制表符为分隔符的非固定宽度格式的文本文件。

下面是我得到的结果。

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      

请您参考如下方法:

您可以预处理数据以获得每列的最大宽度 并使用 string format mini language 写入文件:

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()) 

输出:

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