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