文章目录

  • CSV文件处理
  • CSV文件读取的两种方式
  • CSV文件写入的两种方式
  • Excel文件处理
  • 读取Excel文件
  • cell的相关操作
  • cell的数据类型
  • 写入Excel文件步骤
  • 编辑Excel文件


CSV文件处理

CSV文件读取的两种方式

1、reader(fp)
这种方式读取到的每一条数据是一个列表,元素需要通过列表名加下标的方式获取

import csv

def open_csv_1(file_obj):
	'''
	这种方式读取到的每一条数据是一个列表,元素需要通过列表名加下标的方式获取
	'''
	with open(file_obj, 'r', encoding = 'utf-8' ) as fr:
		reader = csv.reader(fr)
		for i in reader:
			print(i[index])
file_obj = './test.csv'
open_csv_1(file_obj)

2、DictReader(fp)
这种方式读到的每一条数据是一个字典,通过关键字形式获取需要的值

import csv

def open_csv_1(file_obj):
	'''
	这种方式读到的每一条数据是一个字典,通过关键字形式获取需要的值
	'''
	with open(file_obj, 'r', encoding = 'utf-8' ) as fr:
		reader = csv.DictReader(fr)
		for i in reader:
			print(i['name'])
file_obj = './test.csv'
open_csv_1(file_obj)

CSV文件写入的两种方式

1、writer(fp)
创建了一个writer的对象,用这个对象可以调用writerow、writerows方法,将python对象写入csv文件

import csv

head = ('name', 'age', 'score')
student = [
	('张三', 12, 100),
	('李四', 23, 99),
	('王五', 14, 1001)
]
# newline 是为了保证csv中的数据之间不会出现空行,默认是\n
with open('student.csv', 'w', encoding = 'utf-8', newline = '') as f:
	content = csv.writer(f)
	# writerow只能写入一行数据
	content.writerow(head)
	# writerows可以将全部内容写入
	content.writerows(student)

python批量读取多个csv文件中的部分数据写入一个csv文件_excel

2、DictWriter(fp, head)

# 如果要用DicWriter方法的话,数据就要修改成字典的样式了
student = [
	{'name':'张三','age': 12,'score' :100},
	{'name':'李四','age': 23,'score' :99},
	{'name':'王五','age': 14,'score' :1001}
]
with open('student1.csv', 'w', encoding = 'utf-8', newline = '') as f:
	# DictWriter方法中除了文件指针之外,还需要加入存储头部数据的变量名
	# 但是这没有办法直接将head头部数据写入
	# 还需要调用writeheader()方法才可
	content = csv.DictWriter(f, head)
	content.writeheader()
	# writerow只能写入一行数据
	# content.writerow(head)
	# writerows可以将全部内容写入
	content.writerows(student)

python批量读取多个csv文件中的部分数据写入一个csv文件_excel

Excel文件处理

openpyxl与xlrd/xlwt的区别和效率

区别:

效率:

python中xlrd/xlwt与openpyxl处理Excel的主要区别在于写入操作,其中xlwt针对Ecxec2007之前的版本,即.xls文件,其要求单个sheet不超过65535行,而openpyxl则主要针对Excel2007之后的版本(.xlsx),它对文件大小没有限制。

整体而言,两种包对小文件的读写速度差别不大,而面对较大文件,xlrd/xlwt速度明显优于openpyxl,但因为xlwt无法生成xlsx是个硬伤,所以想要尽量提高效率又不影响结果时,可以考虑用xlrd读取,用openpyxl写入。

读取Excel文件

打开Excel文件

xlrd.open_workbook('test.xls')

获取sheet

sheet_names()

获取所有sheet的名字

sheet_by_index()

根据索引获取sheet对象

sheet_by_name()

根据名字获取sheet对象

sheets()

获取所有sheet对象

sheet.nrows

获取当前sheet的行数

sheet.ncols

获取当前sheet的列数

基本的代码操作

import xlrd
import xlwt
workbook = xlrd.open_workbook('chart_style.xlsx')
# sheet_names()获取文件当中所有sheet名字
print(workbook.sheet_names())
# sheet_by_index() 通过索引获取对象
sheet = workbook.sheet_by_index(1)
print(sheet.name)
# sheet_by_name()  通过名字获取对象
sheet = workbook.sheet_by_name('bubbleChart')
print(sheet.name)
# sheets()  获取所有sheet对象 返回值是list
sheet = workbook.sheets()
print(sheet)
# sheet.nrows() 获取指定sheet行数
sheet = workbook.sheet_by_name('pieChart')
print(sheet.nrows)
# sheet.ncols() 与上面同理

excel文件中的相应数据

python批量读取多个csv文件中的部分数据写入一个csv文件_python_03


代码运行之后获取的对应结果

python批量读取多个csv文件中的部分数据写入一个csv文件_csv_04

cell的相关操作

sheet.cell(row,col)

获取指定行和列的cell对象

sheet.row_slice(row,start_col,end_col)

获取指定行的某几列的cell对象

sheet.col_slice(col,start_row,end_row)

获取指定列的某几行的cell对象

sheet.cell_value(row, col)

获取指定行和列的值

sheet.row_values(row,start_col,end_col)

获取指定行的某几列的值

sheet.col_values(col, start_row, end_row)

获取指定列的某几行的值

具体实现的代码

# cell相关操作
# 先获取某一个sheet
sheet1 = workbook.sheet_by_index(0)
# 获取指定行列的cell对象
cell = sheet1.cell(0,1)
# cell.value 获取单元格的值
print(cell.value)
# 获取指定行的某几列cell对象
cell_row = sheet1.row_slice(0,0,2)
print(cell_row, type(cell_row))
# 获取指定列的某几行cell对象
cell_col = sheet1.col_slice(1, 0, 6)
print(cell_col)
for cell in cell_col:
	print(cell.value)
# 直接获取指定行列的cell值
cell_value = sheet1.cell_value(3,1)
print(cell_value)
# 获取指定行的某几列的值
cell_row_value = sheet1.row_values(1,0,2)
print(cell_row_value)
# 获取指定列的某几行的值
cell_col_value = sheet1.col_values(0,1,6)
print(cell_col_value)

文件的具体数据

python批量读取多个csv文件中的部分数据写入一个csv文件_数据_05

实现的结果

python批量读取多个csv文件中的部分数据写入一个csv文件_数据_06

cell的数据类型

xlrd.XL_CELL_TEXT(Text)

文本类型

xlrd.XL_CELL_NUMBER(Number)

数值类型

xlrd.XL_CELL_DATE(Date)

日期时间类型

xlrd.XL_CELL_BOOLEAN(Bool)

布尔类型

xlrd.XL_CELL_EMPTY

空白数据类型

处理的文件数据

python批量读取多个csv文件中的部分数据写入一个csv文件_csv_07


具体实现的代码

#cell的数据类型
# 先获取sheet
sheet1 = workbook.sheet_by_index(1)
# 获取cell
cell = sheet1.cell(0, 0)
print(cell.ctype)
print('xlrd.XL_CELL_TEXT:',xlrd.XL_CELL_TEXT)
cell = sheet1.cell(1, 1)
print(cell.ctype)
print('xlrd.XL_CELL_NUMBER:', xlrd.XL_CELL_NUMBER)
cell = sheet1.cell(7, 0)
print(cell.ctype)
print('xlrd.XL_CELL_DATE:', xlrd.XL_CELL_DATE)
cell = sheet1.cell(7, 1)
print(cell.ctype)
print('xlrd.XL_CELL_BOOLEAN:', xlrd.XL_CELL_BOOLEAN)
cell = sheet1.cell(7, 2)
print(cell.ctype)
print('xlrd.XL_CELL_EMPTY:', xlrd.XL_CELL_EMPTY)

实现效果

python批量读取多个csv文件中的部分数据写入一个csv文件_CSV_08

写入Excel文件步骤

1、

导入xlwt模块

2、

创建一个Workbook对象

3、

创建一个Sheet对象

4、

使用sheet.write方法把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需要调用put_cell来添加

5、

保存成Excel文件

具体实现代码:

# 写入excel文件
# 创建写入文件的对象
workbook = xlwt.Workbook()
# add_sheet 创建一个sheet
sheet = workbook.add_sheet('case_sheet')
headers = ['姓名', '语文', '英语', '数学']
for i, head in enumerate(headers):
	'''
	调用write方法写入数据
	write方法中第一个参数:行
	第二个参数:列
	第三个参数:要写入的内容
	'''
	sheet.write(0, i, head)
# 写入姓名
names = ['张三', '李四', '王五', '赵六']
for i , name in enumerate(names):
	sheet.write(i+1, 0, name)
# 批量写入数据
for row in range(1, 5):
	for col in range(1, 4):
		sheet.write(row, col, random.randint(60, 100))
# 保存文件
workbook.save('case_write.xlsx')

python批量读取多个csv文件中的部分数据写入一个csv文件_CSV_09

编辑Excel文件

思路、步骤

1、

先读取原来的Excel文件

2、

然后在读取的sheet上进行单元格的修改

用put_cell(row, col,ctype,vaule,None)即可

3、

重新创建一个新的Excel文件,把之前读到的数据写入的新的文件中

详细代码:

import xlrd
import xlwt
import math
# 打开一个excel文件
rworkbook = xlrd.open_workbook('chart_style.xlsx')
# 获取一个sheet
rsheet = rworkbook.sheet_by_name('bubbleChart')
'''
在原有文件的基础上要加入新的内容
需要用到put_cell方法
里面有五个参数
rowx,colx,ctype,value,xf_index
最后一个参数是去控制样式,写None即可
'''
rsheet.put_cell(0, 3, xlrd.XL_CELL_TEXT,'money', None)
# 读取数据
for row in range(1, rsheet.nrows):
	row_value = rsheet.row_values(row,1,3)
	print(row_value)
	total_money = row_value[0]*row_value[1]
	print(total_money)
	rsheet.put_cell(row,3,xlrd.XL_CELL_NUMBER, total_money,None)
nrows = rsheet.nrows
# 求各数据的平均值 sales、market share 、money
for col in range(1, 4):
	total = rsheet.col_values(col, 1, nrows)
	print('总数', total)
	avg = sum(total) / len(total)
	rsheet.put_cell(nrows, col, xlrd.XL_CELL_NUMBER, avg, None)
	print(avg)

#  写入数据
# 创建Workbook对象
wworkbook = xlwt.Workbook()
wsheet = wworkbook.add_sheet('bubbleChart_add')
# 获取原始文件的行列数
nrows = rsheet.nrows
ncols = rsheet.ncols
for row in range(0, nrows):
	for col in range(0, ncols):
		wsheet.write(row, col, rsheet.cell_value(row, col))
wworkbook.save('更新之后的.xlsx')

运行结果:

python批量读取多个csv文件中的部分数据写入一个csv文件_数据_10