Python: напишите CSV с QUOTE_NONNUMERIC, кроме None

Учитывая данные ['a', '', None, 5], я хотел бы записать файл CSV как:

"a","",,5

Если я использую QUOTE_NONNUMERIC, например:

import csv
with open('eggs.csv', 'w') as csvfile:
    spamwriter = csv.writer(csvfile, quoting=csv.QUOTE_NONNUMERIC)
    spamwriter.writerow(['a', None, 5])

я получил

"a","","",5

но если я удалю quoting=csv.QUOTE_NONNUMERIC, я получу пустую строку без кавычек из Nona, но я также потеряю кавычки вокруг a и пустой строки.

a,,,5

Контекст: я хочу писать файлы, которые можно читать с помощью R readr r: read_csv('eggs.csv', na=c(""), quoted_na=FALSE), который может различать пустую строку и отсутствующие данные.


person Michal Charemza    schedule 06.06.2020    source источник
comment
Кажется, что это невозможно с модулем csv на ответ от здесь, который взят из документации.   -  person ywbaek    schedule 06.06.2020


Ответы (1)


Используя вариант ответа (и комментарий) на странице https://stackoverflow.com/a/11380084/1319998, вы может заменить None в данных экземпляром:

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

тогда это будет выводиться Python csv.writer, используя quoting=csv.QUOTE_NONNUMERIC как пустую строку без кавычек. Более полный пример:

import csv

class EmptyString(int):
    def __str__(self):
        return ''
EmptyString = EmptyString()

def replace_none_with_emptystring(row):
  return [
    val if val is not None else EmptyString
    for val in row
  ]

with open('eggs.csv', 'w') as csvfile:
    spamwriter = csv.writer(csvfile, quoting=csv.QUOTE_NONNUMERIC)
    spamwriter.writerow(replace_none_with_emptystring(['a', '', None, 5]))

спасает

"a","",,5
person Michal Charemza    schedule 06.06.2020