pyhton ——csv/excel数据持久化
import csvwith open("/路径/文件名.csv","r") as csvfile #固定写法,使用open()方法,无需关闭file,'r'表示读操作 read=csv.reader(csvfile) #使用csv.reader()方法,读取文件,返回可迭代类型 for i in read: print i
1.2 写操作:csv.writer
import csvwith open("/路径/文件名.csv","w") as csvfile #'w'表示写操作,有则修改,无则新建 write=csv.writer(csvfile) write.writerow(data) #写入一行操作,data为可迭代类型,如果为字符串,则单个字符为一个元素 write.writerows(data) #写入多行操作,data中一个元素为一行
1.3 添加数据:csv.read--write
方法1:---------------------------------- import csv list1=[] with open('data.csv','r')as csvfile1: #首先---读取数据 read=csv.reader(csvfile1) for i in read: list1.append(i) with open('data.csv','w')as csvfile2: #然后----写入之前读取的数据 writer=csv.writer(csvfile2) date=[list1[0], #在第五行开始添加数据 list1[1], list1[2], list1[3], ['Jack','104']] writer.writerows(date) with open('data.csv','r')as csvfile3: #输出添加后的数据 read2=csv.reader(csvfile3) for i in read2: print(i)
方法2: #读取文件 f = open("./data.csv") #f是一个可迭代对象 result = [] #用于存放每一行的数据 for line in f: row = line.split(",") #将每一行数据用","分割,保存到一个列表中 data = [] for word in row: data.append(word.strip()) #(word.strip())去除数据中多余的空格 result.append(data) f.close() print(result) #当前文件夹下创建一个output.csv文件,将数据写入到其中 with open("output.csv","w") as csvFile: result.append(["Jack","104"]) for row in result: csvFile.write(",".join(row)+"\n") #将一个列表中的数据用","拼接成一个字符串 csvFile.close()
方法3: #使用DictReader方法读写 import csv def getData(path): #path读取文件的路径 result = [] with open(path) as file: reader = csv.DictReader(file) for row in reader: # row.keys() ["name","stuNo"] newRow = {} # row.values() ["ZhangSan","101"] for key,value in zip(row.keys(),row.values()): #获取列名,列值并去空格 newRow[key.strip()] = value.strip() result.append(newRow) return result data = getData("./data.csv") with open("./output.csv","w") as csvFile: data = getData("./data.csv") data.append({"name":"Jack","stuNo":"104"}) fields = ["name","stuNo"] #列标题 writer = csv.DictWriter(csvFile,fieldnames=fields) #用csv模块的dictwrite方法将字典写入到csv文件 writer.writeheader() #将csv文件的第一行(即列名写入到csv文件) for row in data: #遍历字典写入到csv文件中 writer.writerow(row) csvFile.close()
二、excel的操作2.1:使用 xlrd、xlwt (只读、只写)操作
xlrd 读取文件: import xlrd myWorkbook=xlrd.open_workbook('/路径/文件名.xlsx') #获取excel工作簿 mySheets=myWorkbook.sheets() #其次获取所有的工作表 mySheet1=myWorkbook[0] #获取第一个工作表 mySheet1=myWorkbook.sheet_by_index(0) #同上 mySheet1=myWorkbook.sheet_by_name('sheet1') #同上 nrows=mySheet1.nrows #获得所有的行数,int类型 ncols=mySheet1.ncols #获得所有的列数,int类型 myRowValue=mySheet1.row_value(i) #获得i列所有行的值 myCell=mySheet1.cell(i,j) #获取i行,j列单元格 myCell.value #通过单元格获取值 mySheet1.cell_value(i,j) #直接获取表sheet1的i行,j列的值 mySheet1.cell_value(i,j)="new_value" #直接赋值修改单元格的值:xlwt 写入文件: import xlwt new_wk=xlwt.Workbook() #创建工作簿 new_sheet1=new_wk.add_sheet('sheetname') #创建名为sheetname的工作表 sheet.write(i,j,'content') #在i行,j列写入内容:content,i,j从0开始 new_wk.save('/路径/文件名.xlsx') #使用xlwt写入操作后,需要保存
2.2:xlutils 结合 xlrd (添加数据)操作
读、写文件: import xlrd from xlutils.copy import copy workBook=xlrd.open_workbook('/路径/文件名.xlsx') #参考xlrd读操作 new_workBook=copy(workBook) #使用xlutils中copy()方法复制一份工作簿 ws=new_workBook.get_sheet(index) #get_sheet()方法,在仅导入xlrd时不可用,仅对使用copy()之后的工作簿可用 ws.write(i,j,'content') #在i行,j列写入内容:content,i,j从0开始,可覆盖 new_workBook.save('/路径/文件名.xlsx')
2.3:使用 openpyxl 操作 (写Excel神器)
写入单个数据
读、写文件: from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.writer.excel import ExcelWriter workBook=load_workbook('/路径/文件名.xlsx') sheetNames=workBook.sheetnames #获取工作簿所有工作表名称,返回列表 sheet1=myWorkbook.get_sheet_by_name('Sheet1') #获取myWorkbook的表单Sheet1 sheet1.cell(i,j).value #获取i行,j列单元格的值,注意:此时单元格索引有变,从1开始 sheet1['C3']='content' #为C3单元格写入值,注意:此时单元格索引有变,分别从A,1开始 sheet1.cell(i,j).value = 'values'
三、python封装类来读写 excel 文件
在这里我封装了一个类,方便以后使用
from openpyxl import Workbook #导入openpyxl模块的workbook模块,用于写入.xlsxfrom openpyxl import load_workbookfrom openpyxl.writer.excel import ExcelWriter封装类: class saveExcelData(object): # 定义类(用于封装函数,方便以后使用) def __init__(self,dataList,sheetTitle,fileName):#定义构造函数分别传入数据,工作表标题,保存文件名称 self.dataList=dataList self.sheetTitle=sheetTitle self.fileName=fileName def saveData(self): # 定义保存操作 workbook = Workbook() # 1、新建一个工作簿,实例化对象 sheet = workbook.active # 2、激活一个工作表 sheet.title = self.sheetTitle # 3、给激活的工作表命名 for i in self.dataList: # dataList传入的应为iterable元素组成的iterable容器类型 sheet.append(i) workbook.save(self.fileName)
使用类:from day12_csv_xls.save_class_excel import SavaExcelData# (上层文件夹) (文件名) (文件名里的类名)data = list(range(20))new_data = []for i in range(4): new_data.append(data[len(data)//4*i:len(data)//4*(i+1)]) #写入数据顺序为 data[0:4],data[5:10],data[10:15],data[15:20] print(len(new_data))new1 = SavaExcelData(new_data, 'new_title', 'new_file.xlsx')new1.saveData()
四、综合练习
对Excel表中的行进行筛选并排序,(依照其中一列的数据对每行进行排序)写入到新表单中
方法1:import xlrdimport xlwtold_wbk = xlrd.open_workbook("rank.xlsx")rank = old_wbk.sheets()[0]nrows = rank.nrows #获取工作表数据的行数filterData = [] #保存筛选后的数据for row in range(nrows): myRowValue = rank.row_values(row) #从表中获取行数据 if row is 0 or myRowValue[2]>5.0: #判断行数据,如果是第一行表头或者是points分数大于5.0的数据行保留 filterData.append(myRowValue)headers = filterData[0] #获取表头并写入到新的Excel表中new_wbk = xlwt.Workbook() #创建一个新的工作簿new_rank = new_wbk.add_sheet("new_rank")#添加表单for col in range(len(headers)): new_rank.write(0,col,headers[col])del filterData[0] #将表头从filterData中删除points = [] #将points从筛选后的数据中分离出来for item in filterData: points.append(item[2])points.sort(reverse=True) #对分数进行排序resutl = [] #存放最终排序后的结果#将筛选后的数据与排序后的分数进行比较,依次添加到新的列表中for point inpoints: for row in filterData: if row[2] == point: resutl.append(row)print(resutl)for row in range(0,len(resutl)): for col in range(len(headers)): new_rank.write(row+1,col,resutl[row][col])new_wbk.save("new_rank.xls")
方法2--通用方法
import xlrdimport xlwtwb=xlrd.open_workbook("./素材/two/rank.xlsx")mysheet=wb.sheet_by_index(0)nrows=mysheet.nrows #获取所有的行数# print(nrows)all_data=[]for i in range(nrows): row_values=mysheet.row_values(i) #将所有数据根据条件points>5帅选后保存 # print(row_values[-1]) if i>0 and row_values[-1] > 5: all_data.append(row_values) elif i==0: #跳过表头 all_data.append(row_values) else: continue# print(all_data) #读取数据head=all_data[:1]data=all_data[1:]for i in range(len(data)): for j in range(i): if data[i][-1]>data[j][-1]: #对某行的指定列value值进行对比 data[i],data[j]=data[j],data[i]print(data) #排序后wb=xlwt.Workbook()new_sheet=wb.add_sheet("rank")for i in range(len(head)): new_sheet.write(0,i,head[i])for j in range(len(data)): for k in range(len(data[j])): new_sheet.write(j+1, k, data[j][k]) #写入新表单(更新)wb.save("output.xls")
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。