Skip to main content
 首页 » 编程设计

python之如何使用 Python CSV Writer 保留尾随零

2025年05月04日13thcjp

我正在尝试将带有单独 json 行的 json 文件转换为 csv。 json 数据有一些我需要维护的尾部为零的元素(例如 1.000000)。写入 csv 时,值更改为 1.0,删除除小数点后的第一个零之外的所有尾随零。我怎样才能保留所有尾随零?尾随零的数量可能并不总是静态的。

更新了示例数据的格式。

这是 json 输入的示例:

{"ACCOUNTNAMEDENORM":"John Smith","DELINQUENCYSTATUS":2.0000000000,"RETIRED":0.0000000000,"INVOICEDAYOFWEEK":5.0000000000,"ID":1234567.0000000000,"BEANVERSION":69.0000000000,"ACCOUNTTYPE":1.0000000000,"ORGANIZATIONTYPEDENORM":null,"HIDDENTACCOUNTCONTAINERID":4321987.0000000000,"NEWPOLICYPAYMENTDISTRIBUTABLE":"1","ACCOUNTNUMBER":"000-000-000-00","PAYMENTMETHOD":12345.0000000000,"INVOICEDELIVERYTYPE":98765.0000000000,"DISTRIBUTIONLIMITTYPE":3.0000000000,"CLOSEDATE":null,"FIRSTTWICEPERMTHINVOICEDOM":1.0000000000,"HELDFORINVOICESENDING":"0","FEINDENORM":null,"COLLECTING":"0","ACCOUNTNUMBERDENORM":"000-000-000-00","CHARGEHELD":"0","PUBLICID":"xx:1234346"} 

这是输出示例:

ACCOUNTNAMEDENORM,DELINQUENCYSTATUS,RETIRED,INVOICEDAYOFWEEK,ID,BEANVERSION,ACCOUNTTYPE,ORGANIZATIONTYPEDENORM,HIDDENTACCOUNTCONTAINERID,NEWPOLICYPAYMENTDISTRIBUTABLE,ACCOUNTNUMBER,PAYMENTMETHOD,INVOICEDELIVERYTYPE,DISTRIBUTIONLIMITTYPE,CLOSEDATE,FIRSTTWICEPERMTHINVOICEDOM,HELDFORINVOICESENDING,FEINDENORM,COLLECTING,ACCOUNTNUMBERDENORM,CHARGEHELD,PUBLICID 
John Smith,2.0,0.0,5.0,1234567.0,69.0,1.0,,4321987.0,1,000-000-000-00,10012.0,10002.0,3.0,,1.0,0,,0,000-000-000-00,0,bc:1234346 

代码如下:

import json 
import csv 
 
f=open('test2.json') #open input file 
 
outputFile = open('output.csv', 'w', newline='') #load csv file 
 
output = csv.writer(outputFile) #create a csv.writer 
 
i=1 
for line in f: 
    try: 
        data = json.loads(line) #reads current line into tuple 
    except: 
        print("Can't load line {}".format(i)) 
    if i == 1: 
        header = data.keys() 
        output.writerow(header) #Writes header row 
    i += 1 
    output.writerow(data.values()) #writes values row 
 
f.close() #close input file 

所需的输出如下所示:

ACCOUNTNAMEDENORM,DELINQUENCYSTATUS,RETIRED,INVOICEDAYOFWEEK,ID,BEANVERSION,ACCOUNTTYPE,ORGANIZATIONTYPEDENORM,HIDDENTACCOUNTCONTAINERID,NEWPOLICYPAYMENTDISTRIBUTABLE,ACCOUNTNUMBER,PAYMENTMETHOD,INVOICEDELIVERYTYPE,DISTRIBUTIONLIMITTYPE,CLOSEDATE,FIRSTTWICEPERMTHINVOICEDOM,HELDFORINVOICESENDING,FEINDENORM,COLLECTING,ACCOUNTNUMBERDENORM,CHARGEHELD,PUBLICID 
John Smith,2.0000000000,0.0000000000,5.0000000000,1234567.0000000000,69.0000000000,1.0000000000,,4321987.0000000000,1,000-000-000-00,10012.0000000000,10002.0000000000,3.0000000000,,1.0000000000,0,,0,000-000-000-00,0,bc:1234346 

请您参考如下方法:

我一直在尝试,我认为这可能会解决您的问题:

将 str 函数传递给 json.loads 中的 parse_float 参数 :)

data = json.loads(line, parse_float=str) 

这样,当 json.loads() 尝试解析 float 时,它将使用 str 方法,因此它将被解析为字符串并保持零。尝试这样做并且有效:

i=1 
for line in f: 
    try: 
        data = json.loads(line, parse_float=str) #reads current line into tuple 
    except: 
        print("Can't load line {}".format(i)) 
    if i == 1: 
        header = data.keys() 
        print(header) #Writes header row 
    i += 1 
    print(data.values()) #writes values row 

更多信息在这里:Json Documentation

PS:您可以使用 bool 值而不是 i += 1 来获得相同的行为。