情境:在出完所有包的图之后,我获得了80多个病人的标记文件,都用各自的编号编好了,label也已经标注好了。
病人的标注文件但是老师给我的表格数据里有180多个病人,其中大部分是没有的,所以我就要把已经标好病例的资料从表格中提取出来组成一个文件。
参考:https://www.cnblogs.com/insane-Mr-Li/p/9092619.html
思路:将所有病人的文件夹组成一个列表。将整个表格按照行数遍历,把影像号与病人id列表比对,如果有就提取这个病人的信息组成一个字典。然后把所有的字典放进一个列表,然后通过这个列表生成一个csv文件。
使用的包:os,xlrd,csv
import os
import xlrd
import csv
path = 'D:/AIproject/'
filename = os.listdir(path + 'jpg_dataset/data/') #获取所有病人文件夹的名字
len(filename) #看看文件夹数量对不对
data = xlrd.open_workbook(path + 'dataset.xlsx')
names = data .sheet_names() #看看这个表格有几个sheet,后面要提取sheet
table = data.sheet_by_name('Sheet1') #按名字提取出sheet1
nrows = table.nrows #获取行数,这儿行数包括了标题行,后面要把标题行去掉
patients = [] #建立一个空列表,后面拿来放病人
for i in range(1,nrows): #标题是第0行,注意不要加入循环
id = str(int(table.cell_value(i,2)))
#cell_value取出来的是一个数值,会有小数点,所以先用int取整,然后用str将其转化成字符串,否则后面就没法和filename里面的id匹配
if id in filename: #如果这个id有对应的病人文件夹,那就把病人的信息提取出来,并且给出label的index,生成一个patient的字典。
name = table.cell_value(i,0)
age = table.cell_value(i,1)
detail = table.cell_value(i,4)
size = table.cell_value(i,5)
pathology = table.cell_value(i,6)
if pathology == 'IS': #按照病理浸润赋予index
ind = 1
else:
ind = 0
patient = {'name':name,'age':age,
'id':id,'detail':detail,'size':size,
'pathology':pathology , 'ind':ind}
patients.append(patient) #将所有的patient加到patients列表里
#下面是要生成一个csv表格
with open(path + 'dict.csv', 'w',newline='') as csv_file:
w = csv.writer(csv_file)
fieldnames = patients[0].keys() #获取第一个病人的所有键作为表头
w.writerow(fieldnames) #写入表头
for row in patients:
w.writerow(row.values()) #后面就只写值了
xlrd的语法
-
常用单元格中的数据类型
- empty(空的)
- string(text)
- number
- date
- boolean
- error
- blank(空白表格)
-
打开Excel文件读取数据
data = xlrd.open_workbook( path )
path填写文件名以及路径,同样是绝对路径
注意这儿是可以支持中文的,如果路径或者文件名有中文,需要前面加一个r表示原生字符。 -
常用的函数
注意:需要区分,book是指整个大表格,sheet是指单个小的工作表。- 获取book中一个工作表,对于工作表的操作
table = data.sheets()[0] #加载所有sheet table = data.sheet_by_index(sheet_indx) #通过sheetx指定获取第x个sheet table = data.sheet_by_name(sheet_name) #通过sheet的名称来获取工作表 #以上三个函数都会返回一个xlrd.sheet.Sheet()对象 names = data.sheet_names() #返回book中所有工作表的名字
- 行的操作
nrows = table.nrows #获取该sheet中的有效行数 table.row(rowx) #返回由第x行中所有的单元格对象组成的列表 table.row_slice(rowx) #返回由该行中,给定的列的所有单元格对象组成的列表 table.row_types(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据类型组成的列表 table.row_values(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据组成的列表 table.row_len(rowx) #返回该列的有效单元格长度
- 列(colnum)的操作
table.col(colx, start_rowx=0, end_rowx=None) #返回由该列中所有的单元格对象组成的列表 table.col_slice(colx, start_rowx=0, end_rowx=None) #返回由该列中所有的单元格对象组成的列表 table.col_types(colx, start_rowx=0, end_rowx=None) #返回由该列中所有单元格的数据类型组成的列表 table.col_values(colx, start_rowx=0, end_rowx=None) #返回由该列中所有单元格的数据组成的列表
- 单元格的操作
table.cell(rowx,colx) #返回单元格对象 table.cell_type(rowx,colx) #返回单元格中的数据类型 table.cell_value(rowx,colx) #返回单元格中的数据
csv的语法
这儿主要用的是一个将字典的列表变成表格的操作
语法回头再探索吧
网友评论