python+csv/Excel——数据持久化

一、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

方法1:(默认按行写)

import csv

data = [0010000108.jpg,0010900109.jpg,0012500111.jpg,0015300113.jpg,001700101.jpg]
        
with open("/路径/文件名.csv","w") as csvfile    #'w'表示写操作,有则修改,无则新建
    write=csv.writer(csvfile)
    write.writerow(data)        #写入一行操作,data为可迭代类型,如果为字符串,则单个字符为一个元素
    write.writerows(data)       #写入多行操作,data中一个元素为一行

=======================================================================
# 若写完的csv文件中间空行,可加入 newline=''
with open("/路径/文件名.csv",'w',newline='') as csvfile:
    write = csv.writer(csvfile)
    write.writerow(('field1','field2'))
    write.writerows(datas)

方法2:(按列写)

import csv

data = [0010000108.jpg,0010900109.jpg,0012500111.jpg,0015300113.jpg,001700101.jpg]
with open('./datas.csv', 'w', newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    for index, row in enumerate(zip(datas)):
        csv_writer.writerow(row)

在这里插入图片描述

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方法读写  
importcsv
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('excel_output2.xls')  # 获取excel工作簿
mySheet1=myWorkbook.sheet_by_index(0)                 # 获取第一个工作表
mySheet2 = myWorkbook.sheet_by_name("Sheet2")         # 获取第二个工作表

nrows = mySheet1.nrows  # 获得所有的行数,int类型
ncols = mySheet1.ncols  # 获得所有的列数,int类型

for i in range(nrows):
    myRowValue1 = mySheet1.row_values(i)     # 获得第i行所有行的值
    myRowValue2 = mySheet1.row_values(i)[0]  # 获得第i行第0列所有行的值(此循环获取表单0列的所有值)

for j in range(nrows):
    for k in range(nrows):
        myCell = mySheet1.cell_value(j, k)   # 获取(j行,k列)单元格的值(此循环获取表单的所有值)
xlwt 写入文件:

import xlwt

#数据格式:data_all
data_all = [[12,23,34,45],[荆轲,秦始皇,东皇太一,周庄],[a,b,c,d],[A,B,C,D]]

def save_fiel(data_all):
    book=xlwt.Workbook()                         # 创建工作簿
    new_sheet1=book.add_sheet('sheetname')       # 创建名为sheetname的工作表
    for i in range(len(data_all)):
        for j in range((len(data_all[i])):
            new_sheet1.write(i,j,data_all[i][j]) # 在i行,j列写入内容:content,i,j从0开始
    book.save('./Excel_name.xls')                # 保存

save_fiel(data_all)

示例: 读取excel某列

# -*- coding: utf-8 -*-
import xlrd


def read_excel(excel_path):
    workbook = xlrd.open_workbook(excel_path)
    sheet = workbook.sheet_by_name("Sheet1")
    nrows = sheet.nrows
    values_list = []
    for i in range(1,nrows):
        values = sheet.row_values(i)[0]
        values_list.append(str(values)[-14:])
    return values_list

示例: 批量保存 excel 表单(多个Sheet表单)

import pandas as pd


Sheet1 = {
    "省份": ["上海", "浙江", "江苏"],
    "年份": [2001, 2009, 2015],
    "人口": [2355555, 4563322, 2112323]
}

Sheet2 = {
    "省份": ["广东", "广西", "云南"],
    "年份": [2002, 2012, 2016],
    "人口": [2355555, 4563322, 211323]
}

Sheet3 = {
    "省份": ["北京", "天津", "湖北"],
    "年份": [2003, 2013, 2016],
    "人口": [42342323, 4563322, 212323]
}

if __name__ == '__main__':
    df_1 = pd.DataFrame(Sheet1)
    df_2 = pd.DataFrame(Sheet2)
    df_3 = pd.DataFrame(Sheet3)
    
    writer = pd.ExcelWriter("./表单.xlsx")
    df_1.to_excel(writer, sheet_name="长三角")
    df_2.to_excel(writer, sheet_name="珠三角")
    df_3.to_excel(writer, sheet_name="京津冀")
    writer.save()
    writer.close()
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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值