1 回答
TA贡献1848条经验 获得超10个赞
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由于无法转换为浮点数的字符串而得到 a,则不必担心关闭文件。事实上,即使你想,你也做不到,因为你无权使用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()
添加回答
举报
