How to generate the csv file with the Number field but None value

Question:

I got a requirement to get data from database and write them into file with CSV format.
and the further requirement is the field needs to be sepread by the comma char, and the String value needs to be enclosed with double quota char, and other fileds no need.
but when write them into csv, the number field with Null value is enclosed with double quota char.
below is my test code.

import csv

results = [("aaa", 123.1,323.1),("bbb",None,2345)]
with open('test.csv','w', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile, quotechar='"',quoting=csv.QUOTE_NONNUMERIC)
    csvwriter.writerows(results)

the result after exporting is below.

"aaa",123.1,323.1
"bbb","",2345

My question is how to get the result below.

"aaa",123.1,323.1
"bbb",,2345
Asked By: user571102

||

Answers:

Setting quoting to csv.QUOTE_NONNUMERIC means to quote all non-numeric values, and since None (or '') is not a numeric type, its output gets quoted.

A workaround is to create a subclass of a numeric type and force its string conversion to be '', so that it passes csv‘s numeric type check and gets a non-quoted empty output:

import csv

class empty_number(int):
    def __str__(self):
        return ''

EmptyNumber = empty_number()

results = [("aaa", 123.1, 323.1), ("bbb", EmptyNumber, 2345)]
with open('test.csv','w', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile, quotechar='"',quoting=csv.QUOTE_NONNUMERIC)
    csvwriter.writerows(results)

Demo: https://replit.com/@blhsing/BurlyForthrightDatawarehouse

Answered By: blhsing
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.