Python读写excel、csv

CSV文件读写

CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看。由于是纯文本,任何编辑器也都可打开。与Excel文件不同,CSV文件中:

  • 值没有类型,所有值都是字符串
  • 不能指定字体颜色等样式
  • 不能指定单元格的宽高,不能合并单元格
  • 没有多个工作表
  • 不能嵌入图像图表

在CSV文件中,以,作为分隔符,分隔两个单元格。像这样a,,c表示单元格a和单元格c之间有个空白的单元格。依此类推。

不是每个逗号都表示单元格之间的分界。所以即使CSV是纯文本文件,也坚持使用专门的模块进行处理。Python内置了csv模块。先看看一个简单的例子。

从CSV文件中读取数据

1
2
3
4
5
6
import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
print(list(reader))

data不能直接打印,list(data)最外层是list,里层的每一行数据都在一个list中,有点像这样

1
[['name', 'age'], ['Bob', '14'], ['Tom', '23'], ...]

于是我们可以这样访问到Bob的年龄reader[1][1], 在for循环中遍历如下

1
2
3
4
5
6
7
8
import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
for row in reader:
# 行号从1开始
print(reader.line_num, row)

截取一部分输出

1
2
3
1 ['AKST', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', ' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn', ' Mean Sea Level PressureIn', ' Min Sea Level PressureIn', ' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles', ' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH', 'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
2 ['2014-1-1', '46', '42', '37', '40', '38', '36', '97', '86', '76', '29.95', '29.77', '29.57', '10', '8', '2', '25', '14', '36', '0.69', '8', 'Rain', '138']
...

前面的数字是行号,从1开始,可以用reader.line_num获取。

要注意的是,reader只能被遍历一次。由于reader是可迭代对象,可以使用next方法一次获取一行。

1
2
3
4
5
6
7
8
9
10
import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
# 读取一行,下面的reader中已经没有该行了
head_row = next(reader)
for row in reader:
# 行号从2开始
print(reader.line_num, row)

写数据到csv文件中

利用csv库写数据到csv文件中

有reader可以读取,当然也有writer可以写入。一次写入一行,一次写入多行都可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import csv

# 使用数字和字符串的数字都可以
datas = [['name', 'age'],
['Bob', 14],
['Tom', 23],
['Jerry', '18']]

with open('example.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in datas:
writer.writerow(row)

# 还可以写入多行
writer.writerows(datas)

如果不指定newline='',则每写入一行将有一空行被写入。上面的代码生成如下内容。

1
2
3
4
5
6
7
8
name,age
Bob,14
Tom,23
Jerry,18
name,age
Bob,14
Tom,23
Jerry,18

利用pandas库写数据到csv文件中

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
import csv
df = pd.read_csv('sample_submission.csv')
label = np.load('label.npy')
label_dict = {'0':'HTC-1-M7','1':'iPhone-4s','2':'iPhone-6','3':'LG-Nexus-5x','4':'Motorola-Droid-Maxx',
'5':'Motorola-Nexus-6','6':'Motorola-X','7':'Samsung-Galaxy-Note3','8':'Samsung-Galaxy-S4','9':'Sony-NEX-7'}
# result = []
for index, y in enumerate(label):
# result.append(label_dict[str(y)])
df['camera'][index] = label_dict[str(y)]
df.to_csv("sub.csv", index=False)

excel文件读写

安装xlrd模块

到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。

使用介绍

导入模块

1
import xlrd

打开Excel文件读取数据

1
data = xlrd.open_workbook('excelFile.xls')

获取所有工作表的名称:

1
sheet_names = data.sheet_names()

获取一个工作表

1
2
3
table = data.sheets()[0]          #通过索引顺序获取 
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u'Sheet1') #通过名称获取

获取整行和整列的值(数组)

1
2
table.row_values(i)  # 一定注意这个里面的i值是跟excel表格上面的A到Z对应的!
table.col_values(i)

获取行数和列数

1
2
nrows = table.nrows
ncols = table.ncols

循环行列表数据

1
2
for i in range(nrows ):
print table.row_values(i)

读取单元格的值

1
2
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(2,3).value

使用行列索引

1
2
cell_A1 = table.row(0)[0].value 
cell_A2 = table.col(1)[0].value

写入一个数据到某行某列

1
2
3
4
5
6
7
8
9
row = 0
col = 0

# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
ctype = 1 value = '单元格的值'
xf = 0 # 扩展的格式化
table.put_cell(row, col, ctype, value, xf)
table.cell(0,0) #单元格的值'
table.cell(0,0).value #单元格的值'

写list到一行或者一列:

1
2
3
4
5
6
7
8
9
10
11
12
f = xlwt.Workbook(encoding = 'utf-8', style_compression=0)
sheet1 = f.add_sheet('test',cell_overwrite_ok=True)
# 生成第一列
for i in range(0, len(result_list)):
sheet1.write(i, 0, result_list[i])

f.save('demo1.xls')
# 生成第一行
for j in range(0,len(result_list)):
sheet1.write(0,j,result_list[j])

f.save('demol.xls')

Demo代码

Demo代码其实很简单,就是读取Excel数据。

demo1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- coding: utf-8 -*- 
import xdrlib ,sys
import xlrd
def open_excel(file= 'file.xls'):
try:
data = xlrd.open_workbook(file)
return data
except Exception,e:
print str(e)
#根据索引获取Excel表格中的数据 参数:file:Excel文件路径 colnameindex:表头列名所在行的所以 ,by_index:表的索引
def excel_table_byindex(file= 'file.xls',colnameindex=0,by_index=0):
data = open_excel(file)
table = data.sheets()[by_index]
nrows = table.nrows #行数
ncols = table.ncols #列数
colnames = table.row_values(colnameindex) #某一行数据
list =[]
for rownum in range(1,nrows):

row = table.row_values(rownum)
if row:
app = {}
for i in range(len(colnames)):
app[colnames[i]] = row[i]
list.append(app)
return list

#根据名称获取Excel表格中的数据 参数:file:Excel文件路径 colnameindex:表头列名所在行的所以 ,by_name:Sheet1名称
def excel_table_byname(file= 'file.xls',colnameindex=0,by_name=u'Sheet1'):
data = open_excel(file)
table = data.sheet_by_name(by_name)
nrows = table.nrows #行数
colnames = table.row_values(colnameindex) #某一行数据
list =[]
for rownum in range(1,nrows):
row = table.row_values(rownum)
if row:
app = {}
for i in range(len(colnames)):
app[colnames[i]] = row[i]
list.append(app)
return list

def main():
tables = excel_table_byindex()
for row in tables:
print row

tables = excel_table_byname()
for row in tables:
print row

if __name__=="__main__":
main()

demo2:

1
2
3
4
5
6
excel_data = xlrd.open_workbook('100.xlsx')
table = excel_data.sheet_by_name(u'Sheet1')
id = table.col_values(0)
name = table.col_values(1)
class_ = table.col_values(2)
value = table.col_values(3)
------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道