python - 如何使用 Python CSV Writer 保留尾随零
问题描述
我正在尝试将带有单个 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
解决方案
模块的解码器默认json
解析实数float
,因此不会保留尾随零,因为它们不在 Python 中。您可以使用该方法的parse_float
参数来使用json.loads
构造函数覆盖 JSON 解码器的实数str
构造函数:
data = json.loads(line, parse_float=str)
推荐阅读
- php - 如何在 phpmysql 中加入 4 个表以正确加入?
- c++ - 从 C++ 访问 PostgreSQL 数据库的更可靠方法
- algorithm - 找到找到所有键的最短路径
- gdb - gdb 单步执行函数直到到达断点
- sql-server - 使用动态查询的 SQL 查询优化
- python - 正则表达式删除python中数据的某些模式匹配
- android - 获取 GPS 的 requestLocationUpdates 不起作用
- java - 有人可以帮我将这个带有回调的 Kotlin 函数转换为 java 函数吗?
- oracle - Debezium oracle on confluent 找不到适合 jdbc:oracle:oci 的驱动程序
- logging - 在 GCP 中收集 Kubernetes 中的日志的选项