заменить None на Null, вместо

#python #csv #null

#python #csv #null

Вопрос:

У меня есть требование перенести результаты моих тестов в csv для отчетности. В моем тестовом коде python, когда у меня нет значения, мои переменные заполняются способом python с None .

Меня попросили заменить их на «Null» в CSV для инструмента отчетности. Я думаю, что это легко и, вероятно, решается сто раз.

Вот код, который я придумал:

    for field in (TestCase.productUnderTest,TestCase.versionUnderTest,TestCase.name,TestCase.results,TestCase.lastTestEnd,TestCase.parent,TestCase.level):
        if field == None: 
             field = 'Null'

    ME.csvoutput.write("%s,%s,%s,%s,%s,%s,%sn" % (TestCase.productUnderTest,TestCase.versionUnderTest,TestCase.name,TestCase.results,TestCase.lastTestEnd,TestCase.parent,TestCase.level))
  

К сожалению, это изменяет поле только в пределах цикла for . Как я могу изменить его для области действия оператора write.

(Я был бы очень рад просто написать «Null» и оставить свои переменные без изменений, но я могу работать в любом случае.)

Ответ №1:

 result = [TestCase.productUnderTest,TestCase.versionUnderTest,TestCase.name,TestCase.results,TestCase.lastTestEnd,TestCase.parent,TestCase.level]
result = map(lambda x:x==None and 'Null' or str(x), result)
ME.csvoutput.write(",".join(result) 'n')
  

Комментарии:

1. В случае, если есть числа, вы должны применить ‘str’ к x, если это не None, чтобы позволить ‘join’ работать должным образом.

2. map и lambda устарели

3. @vartec: В этом случае мы могли бы использовать простое понимание списка или генератор. например. [x==None и ‘Null’ или str (x) для x в результате]

4. Спасибо, это сработало отлично. Конечно, если map и lambda устарели, какое более современное решение?

5. @SkipHuffman: [('Null' if x is None else str(x)) for x in result]

Ответ №2:

Чтобы сохранить свой код, вы можете попробовать:

 for field_name in ('productUnderTest','versionUnderTest','name','results','lastTestEnd','parent','level'):
    if getattr(TestCase, field_name) is None:
        setattr(TestCase, 'Null')
  

Я предлагаю взглянуть на модуль csv.

Комментарии:

1. Я посмотрю на модуль csv. Я забыл об этом. (Использовался в прошлом, но не в последнее время.)

Ответ №3:

Сделайте это так:

 fields = [str(field) or "Null" for field in (TestCase.productUnderTest,TestCase.versionUnderTest,TestCase.name,TestCase.results,TestCase.lastTestEnd,TestCase.parent,TestCase.level)]
ME.csvoutput.write("%sn" % ",".join(fields))))
  

Или, что еще более эффективно: вместо этого используйте объект generator:

 fields = (str(field) or "Null" for field in (TestCase.productUnderTest,TestCase.versionUnderTest,TestCase.name,TestCase.results,TestCase.lastTestEnd,TestCase.parent,TestCase.level))
  

Ответ №4:

Вы должны использовать метод Pandas fillna:

 from pandas import DataFrame
DataFrane.fillna(value='NULL', inplace=True)
  

Пример

 import pandas as pd
df = pd.read_csv(csv_file)
df.fillna(value='NULL', inplace=True)