问题描述
我正在尝试在python中运行以下代码:
kf = KFold(n_splits=num_splits)
n = 0
for train_index, test_index in kf.split(mask_list):
with open(join(outdir,'train_split_' + str(n) + '.csv'), 'wb') as csvfile:
writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for i in train_index:
writer.writerow([basename(mask_list[i])])
with open(join(outdir,'test_split_' + str(n) + '.csv'), 'wb') as csvfile:
writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for i in test_index:
writer.writerow([basename(mask_list[i])])
n += 1
但这给了我:
writer.writerow([basename(mask_list[i])])
TypeError: a bytes-like object is required, not 'str'
可能是什么?
1楼
CSV是文本文件格式,因此csv
模块生成的输出是字符串。
因此,您应该以文本模式而不是二进制模式打开输出文件:
更改:
with open(join(outdir,'train_split_' + str(n) + '.csv'), 'wb') as csvfile:
至:
with open(join(outdir,'train_split_' + str(n) + '.csv'), 'w') as csvfile:
同样适用于其他输出文件。
2楼
如果您使用的是python3.X,则可以使用newline=''
例如:
kf = KFold(n_splits=num_splits)
n = 0
for train_index, test_index in kf.split(mask_list):
with open(join(outdir,'train_split_' + str(n) + '.csv'), 'w', newline='') as csvfile: #--> !Update
writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for i in train_index:
writer.writerow([basename(mask_list[i])])
with open(join(outdir,'test_split_' + str(n) + '.csv'), 'w', newline='') as csvfile: #--> !Update
writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for i in test_index:
writer.writerow([basename(mask_list[i])])
n += 1