我有嵌套的“最终”函数来保存带有附加模式的文本文件。当我在控制台模式下(使用 PyCharm)执行选择时,我收到此消息
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2721, in run_code
exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-62-9c259f95cff2>", line 1, in <module>
f.write(line)
ValueError: I/O operation on closed file
0
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2721, in run_code
exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-63-f015ac76386b>", line 12, in <module>
f.write(line)
ValueError: I/O operation on closed file
我的功能如下。
def segmentation_accuracy(reference, segmented, output, method="ke", threshold=0.1, sep="space", header=True):
if not check_suffix(reference) or not check_suffix(segmented):
raise ValueError('the input files need to be ESRI shapefile (*.shp)')
ref_shp = ogr.Open(os.path.abspath(reference))
if ref_shp is None:
raise SystemExit('Unable to open %s' % reference)
seg_shp = ogr.Open(os.path.abspath(segmented))
if seg_shp is None:
raise SystemExit('Unable to open %s' % segmented)
if method == "ke" or method == "pu":
if threshold is None:
raise AccuracyException("threshold need to be set with a value between 0.0 and 1.0")
ref_layer = ref_shp.GetLayer()
ref_layer_num = ref_layer.GetFeatureCount()
seg_layer = seg_shp.GetLayer()
seg_layer_num = seg_layer.GetFeatureCount()
if ref_layer.GetGeomType() != 3:
raise ValueError("s% is not a single-part polygons" % (os.path.split(reference)[1]))
if ref_layer.GetGeomType() != 3:
raise ValueError("s% is not a single-part polygons" % (os.path.split(segmented)[1]))
# get shapely polygons
ref_list = polygon_list(ref_layer)
seg_list = polygon_list(seg_layer)
# create text file
ref_path = os.path.split(os.path.abspath(reference))[0]
filename = set_outputfile(output, path=ref_path)
with open(filename, "a") as f:
if header is True:
line = ["FID", "centroidX", "centroidY", "area", "perimeter", "segments", "ra_or", "ra_os", "over_seg", \
"under_seg", "over_merge", "under_merge", "sim_size", "sim_size_std", "AFI", "qr", "seg_error", \
"d_sr", "d_max", "rp_sr"]
line = sepType[sep].join([str(e) for e in line])+ "\n"
f.write(line)
for FID, ref in enumerate(ref_list):
print FID
seg_overlap = list()
for seg in seg_list:
if ref.intersects(seg):
if threshold_type[method](ref, seg, threshold):
seg_overlap.append(seg)
if len(seg_overlap) != 0:
accuracy = Accuracy(ref, seg_overlap)
line = [FID] + accuracy.data
line = sepType[sep].join([str(e) for e in line])+ "\n"
f.write(line)
else:
accuracy = Accuracy(ref)
line = [FID] + accuracy.data
line = sepType[sep].join([str(e) for e in line])+ "\n"
f.write(line)