pyhton ――csv/excel数据持久化

匿名 (未验证) 提交于 2019-12-02 22:56:40

一、CSV文件操作

1.1 读操作:csv.read
import csv with 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 csv with 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模块,用于写入.xlsx from openpyxl import load_workbook from 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  xlrd import xlwt  old_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 xlrd import xlwt wb=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")
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!