#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)