一, 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")
来源: http://www.bubuko.com/infodetail-2791179.html