#python #python-3.x #serialization #yaml #pyyaml
#python #python-3.x #сериализация #yaml #pyyaml
Вопрос:
У меня есть следующий фрагмент:
if file:
try:
with open(file, 'w') as outfile:
try:
yaml.dump(self.dataset_configuration, outfile, default_flow_style=False)
self.dataset_configuration_file = file
except yaml.YAMLError as ex:
_logger.error("An error has occurred while trying to save dataset configuration:n", ex)
except OSError as ex:
_logger.error(f"Unable to create file '{self.dataset_configuration_file}' "
f"to persist the dataset configurationn", ex)
Я заметил, что иногда, если объект не может быть выбран / сериализован, тогда dump
метод завершится ошибкой и запишет пустой файл. Есть ли быстрый способ не перезаписывать открытый файл, если он уже существует, или мне нужно сделать копию файла, а затем, если dump
операция завершится неудачно, я восстановлю файл?
Приведенное выше, согласно предложению @martineau, также может быть переписано как:
if file:
serialized_object_string = ''
try:
serialized_object_string = yaml.dump(self.dataset_configuration, default_flow_style=False)
except yaml.YAMLError as ex:
_logger.error("An error has occurred while trying to save dataset configuration:n", ex)
if serialized_object_string:
try:
with open(file, 'w') as output_file:
output_file.write(serialized_object_string)
self.dataset_configuration_file = file
except OSError as ex:
_logger.error(f"Unable to create file '{self.dataset_configuration_file}' "
f"to persist the dataset configurationn", ex)
В этом случае сначала будет создано строковое представление объекта, а затем оно будет записано в file, если оно не пустое или не удалось сериализовать. Будет ли значительный штраф за то, что вы не пройдете через Stream
объект? Что произойдет, если строковое представление будет очень большим? Есть ли «собственный» способ сделать это выше за одну операцию?
Комментарии:
1.
yaml.dump()
принимает необязательный второй аргумент, который должен быть открытым текстовым или двоичным файлом. Если он не указан, будет возвращен созданный документ. Это означает, что вы можете отложить открытие и запись файла до тех пор, пока послеdump()
возврата не произойдет ошибка.2. @martineau, я немного обновил вопрос.
3. Вероятно, это быстрее и будет использовать больше памяти, но это, вероятно, не будет иметь значения, если вывод не будет
really
огромным, например, 100 миллионов байт. Вы должны быть в состоянии ответить на большинство из этих вопросов самостоятельно, проведя небольшое тестирование и сравнительный анализ.4. Я думаю, вам следует записать ответ, поскольку это действительно вы его предоставили.
5. Изворотливый: спасибо за предложение, но в этом нет необходимости. Считайте это подарком и оплатите его вперед,
;¬)
Ответ №1:
Приведенное выше, согласно предложению @martineau, также может быть переписано как:
if file:
serialized_object_string = ''
try:
serialized_object_string = yaml.dump(self.dataset_configuration, default_flow_style=False)
except yaml.YAMLError as ex:
_logger.error("An error has occurred while trying to save dataset configuration:n", ex)
if serialized_object_string:
try:
with open(file, 'w') as output_file:
output_file.write(serialized_object_string)
self.dataset_configuration_file = file
except OSError as ex:
_logger.error(f"Unable to create file '{self.dataset_configuration_file}' "
f"to persist the dataset configurationn", ex)
Это работает, хотя я надеялся на более «интегрированное» решение.