Обработка ошибок с python и numpy - PullRequest
0 голосов
/ 29 января 2020

У меня есть эта базовая c программа, которая читает чтение ветра, сортирует по количеству, минимуму, максимуму и среднему значению, а затем создает новый файл с показаниями. Однако я также хочу, чтобы он обрабатывал любые исключения, которые могут возникнуть во время файловых операций, и гарантирует, что файл всегда будет закрыт, даже если возникает исключение.

Я очень плохо знаком с python и numpy, поэтому я прошу помощи о том, как решить эту проблему.

Я мог бы сформулировать это неправильно. Я хочу, чтобы обработка ошибок выполнялась следующим образом: если txt-файл содержит строку или что-то еще, программа не должна обрабатывать sh, а вместо этого закрыть файл и затем остановить скрипт

import numpy as np


def main():
    # Converts into a numpy array.
    # loadtxt function has the default dtype as float
    x = np.loadtxt("wind.txt")
    print("There are", len(x), "")
    print('Average:', np.average(x))
    print('Max:', np.amax(x))
    print('Min:', np.amin(x))

    file = open("testfile.txt", "w")
    file.write(f"Amount: {len(x)}\n")
    file.write(f"Average: {np.average(x)}\n")
    file.write(f"Max: {np.amax(x)}\n")
    file.write(f"Min: {np.amin(x)}\n")
    file.close()


main()

1 Ответ

1 голос
/ 29 января 2020

loadtxt - довольно длинная функция, но с точки зрения обработки файлов:

fown = False
try:
    if isinstance(fname, os_PathLike):
        fname = os_fspath(fname)
    if _is_string_like(fname):
        fh = np.lib._datasource.open(fname, 'rt', encoding=encoding)
        fencoding = getattr(fh, 'encoding', 'latin1')
        fh = iter(fh)
        fown = True
    else:
        fh = iter(fname)
        fencoding = getattr(fname, 'encoding', 'latin1')
except TypeError:
    raise ValueError('fname must be a string, file handle, or generator')

...

try:
    for x in read_data(_loadtxt_chunksize):
        if X is None:
            X = np.array(x, dtype)
        else:
            nshape = list(X.shape)
            pos = nshape[0]
            nshape[0] += len(x)
            X.resize(nshape, refcheck=False)
            X[pos:, ...] = x
finally:
    if fown:
        fh.close()

В сумме, если вы даете ему имя файла (строку), он открывает его и отмечает, что он owns файл. Это фактическое чтение файла и синтаксический анализ до dtype защищены предложением try/finally. Если он владеет файлом, он закрывает его.

Так что, если вы получите ValueError из-за строки, которая не может быть преобразована в число с плавающей точкой, вам не нужно беспокоиться о закрытии файла , На самом деле вы даже не могли бы этого делать, поскольку у вас нет доступа к дескриптору fh.

Если вы хотите, чтобы ваш код делал что-то другое после этой ошибки значения, оберните ее:

In [126]: try: 
     ...:     np.loadtxt(["1 2 two"]) 
     ...: except ValueError: 
     ...:     print('got a value error') 
     ...:                                                                                        
got a value error

Или изменить main:

def main():
    # Converts into a numpy array.
    # loadtxt function has the default dtype as float
    try:
         x = np.loadtxt("wind.txt")
    except ValueError:
         print('error reading "wind.txt")
         return   # skips the rest
    print("There are", len(x), "")
    print('Average:', np.average(x))
    print('Max:', np.amax(x))
    print('Min:', np.amin(x))

    file = open("testfile.txt", "w")
    file.write(f"Amount: {len(x)}\n")
    file.write(f"Average: {np.average(x)}\n")
    file.write(f"Max: {np.amax(x)}\n")
    file.write(f"Min: {np.amin(x)}\n")
    file.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...