191221 Python学习笔记——xlrd、csv

2019-12-21  本文已影响0人  dicklim

情境:在出完所有包的图之后,我获得了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的语法

  1. 常用单元格中的数据类型

    • empty(空的)
    • string(text)
    • number
    • date
    • boolean
    • error
    • blank(空白表格)
  2. 打开Excel文件读取数据
    data = xlrd.open_workbook( path )
    path填写文件名以及路径,同样是绝对路径
    注意这儿是可以支持中文的,如果路径或者文件名有中文,需要前面加一个r表示原生字符。

  3. 常用的函数
    注意:需要区分,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的语法

这儿主要用的是一个将字典的列表变成表格的操作
语法回头再探索吧

上一篇下一篇

猜你喜欢

热点阅读