Как передать RuntimeWarning в вывод на печать?

Я запускаю свой код, и он работает правильно. Поскольку он содержит случайные числа, некоторые из этих чисел приводят к недопустимым значениям для функций в коде (это нормально, и мы не знаем, какое число приводит к недопустимому значению). Но при печати Python продолжает печатать и просто показывает эту ошибку один или два раза для этих чисел:

RuntimeWarning: invalid value encountered in...

в дальнейшем:

.
.
.
174.45044049634845 0.2462826944657234 0.07030551312264746 0.5748635625886386
173.507852282145 0.22849596593782928 0.02418486733987143 0.5342742271386651
172.72866355236476 0.23561628491593717 0.00276512493464073 0.5299714003809053

Warning (from warnings module):
  File "C:\...        return (Om*(1+z)**3+omg0*(1+z)**6+(1-Om-omg0))**(-0.5)
RuntimeWarning: invalid value encountered in double_scalars

Warning (from warnings module):
  File "C:\...", line 364
    warnings.warn(msg, IntegrationWarning)
IntegrationWarning: The occurrence of roundoff error is detected, which prevents
  the requested tolerance from being achieved.  The error may be
  underestimated.

Warning (from warnings module):
  File "C:\...", line 1874
    r = _umath_linalg.det(a, signature=signature)
RuntimeWarning: invalid value encountered in det
172.72866355236476 0.23561628491593717 0.00276512493464073 0.5299714003809053
172.83987258470256 0.23561628491593717 0.00276512493464073 0.521804452272765
172.94243737214325 0.23561628491593717 0.00276512493464073 0.5142747330950714
173.81824790232395 0.2447458303542599 -0.014745034802849322 0.3863934727161802
173.81824790232395 0.2447458303542599 -0.014745034802849322 0.3863934727161802
175.04959056025322 0.2447458303542599 -0.014745034802849322 0.2964727561196514
.
.
.

Python продолжают печатать, но я не могу сохранить их в файл, я должен скопировать и вставить. Это невозможно, если у нас есть 5 000 000 данных.

Есть ли способ записать эти выводы в файл?

2 ответа

Решение

Как вы упомянули, warnings а также errors являются барьерами для сохранения данных в файле, поэтому нам нужно их удалить. Вы можете отключить WarningErrorс использованием:

import warnings
warnings.filterwarnings("ignore")

в верхней части вашего кода. Затем вы можете написать вывод в text file,

Также вы можете использовать try and except блоки, но помните, что такие блоки очень плохо влияют на скорость программы. Если вы ожидаете, что ваша программа распечатает 10,000,000даже с кластерами шт вам нужно долго.

Обработайте исключение самостоятельно, обернув ошибочную строку в блок try:

try:
    r = _umath_linalg.det(a, signature=signature)
except RuntimeError as ex:
    error_file.write(ex)
Другие вопросы по тегам