Excel文件格式主要有csv,xlsx和xlsx,对于不同的格式,我们使用不同的包来进行处理。
使用csv
包处理csv文件 读取csv文件 1 2 3 4 5 6 import csvwith open ('./data.csv' , 'r' , newline='' , encoding='utf-8-sig' ) as csvfile: spamreader = csv.reader(csvfile) for row in spamreader: print (row)
其中,encoding='utf-8-sig'
是为了编码正常可以正确显示中文,spamreader
中的每一个row
为list格式,可以循环取出每个单元格的值。
写入csv文件 1 2 3 4 5 6 import csvwith open ('./data.csv' , 'w' , newline='' , encoding='utf-8-sig' ) as csvfile: spamwriter = csv.writer(csvfile) spamwriter.writerow(['HELLO' , 'WORLD' ]) spamwriter.writerows([('SuiXin' , 'Blog' ), ('https://suixinblog.cn' , '2019' , 'CSV' , '文件' )])
结果:
注 :使用delimiter参数来指定数据的分隔符,默认为,
。
使用pandas
包读写csv数据文件 如果csv文件是数据类的,那么使用pandas
包读写数据会更方便。
读取csv数据存入DataFrame对象中 1 2 3 4 import pandas as pddf = pd.read_csv("hou_all.csv" , header=None , names=["CRIM" , "ZN" , "INDUS" , "CHAS" , "NOX" , "RM" , "AGE" , "DIS" , "RAD" , "TAX" , "PTRATIO" , "B" , "LSTAT" , "MEDV" ]) print (df)
结果: 参数:
sep=','
:str,分隔符;
header=0
:int,指定行数用作列名。如果文件不包含列名可以设置为None
;
names
:array-like,指定列名。相当于对没有列名的DataFrame设置df.columns
;
squeeze=False
:bool,如果文件值包含一列,返回一个Series;
prefix
:str,在没有列名时,给列添加前缀。如:prefix='V'
则列名为V0
,V1
,V2
……
skiprows=None
:list-like or int,需要忽略的行数;
nrows=None
:int,需要读取的行数;
skip_blank_lines=True
:bool,是否跳过空行。
将数据写入csv文件 1 2 3 4 5 6 import pandas as pdd = {'NAME' : ['TOM' , 'SuiXin' ], 'AGE' : [12 , 24 ]} df = pd.DataFrame(d) print (df)df.to_csv('data1.csv' , index=False )
结果:
参数:
sep=','
:str,分隔符;
na_rep=''
:str,缺失值表示;
float_format=None
:str,浮点数格式。如float_format='%.2f'
;
columns
:sequence,需要写入的列;
header=True
:bool,list of str,写入列名;
index=True
:bool,写入行名。
使用openpyxl
包处理xlsx文件 Excel文件有三层对象:工作薄、工作表和三元格,分别对应openpyxl
包中的workbook、sheet和cell。
workbook操作 1 2 3 4 5 6 7 8 wb = openpyxl.load_workbook('test.xlsx' ) wb = openpyxl.load_workbook('test.xlsx' , read_only=True ) wb = openpyxl.Workbook() wb.save('test.xlsx' )
sheet操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sheets = wb.worksheets ws = wb['标记数据' ] ws = wb.worksheets[0 ] ws = wb.active print (ws.title, ws.max_row, ws.max_column)ws.title = '标记数据2' wb.remove(ws) del wb['标记数据' ]wb.create_sheet('test1' , 0 )
sheet属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ws[1 ] ws['A' ] ws[2 :4 ] ws['A:D' ] rows = ws.rows columns = ws.columns for row in rows: for i in row: print (i.value) ws.append(['人民法院' , '故意伤害罪' , '89f01654' , 5 ]) s = [['NAME' , 'Make' , 'Tom' , 'Smith' , 'Suixin' ]] for i in zip (*s): ws.append(i)
cell操作 1 2 3 4 5 6 7 8 cell = ws['B3' ] cell = ws.cell(3 , 2 ) print (cell.row, cell.column, cell.coordinate, cell.value)cell.value = 'NAME' ws['B3' ] = 'hello'
注 :openpyxl
功能全面,还支持:合并单元格、数学运算、单元格格式、迭代器ws.iter_rows()
操作等。
使用xlrd
,xlwt
和xlutils
包处理xls文件 使用xlrd
读取xls文件 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 import xlrdwb = xlrd.open_workbook('test.xls' ) sheet_names = wb.sheet_names() ws = wb.sheet_by_index(0 ) ws = wb.sheet_by_name('标记数据' ) print (ws.name, ws.nrows, ws.ncols)row_4 = ws.row_values(3 ) cloumn_5 = ws.col_values(4 ) Row_4 = ws.row(3 ) Column_5 = ws.col(4 ) cell_1_1 = ws.cell_value(0 , 0 ) cell_1_1 = ws.cell(0 , 0 ).value cell_1_1 = ws.row_values(0 )[0 ] cell_1_1 = ws.col_values(0 )[0 ] cell_1_1 = ws.row(0 )[0 ].value cell_1_1 = ws.col(0 )[0 ].value
注 :xlrd
打开为只读模式,不可修改。
使用xlwt
写入新建的xls文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import xlwtwb = xlwt.Workbook(encoding="utf-8" ) ws = wb.add_sheet('S1' , cell_overwrite_ok=True ) ws.write(0 , 0 , 'HELLO' ) title = ['NAME' , 'AGE' , 'SEX' ] for i in range (len (title)): ws.write(0 , i, title[i]) name = ['Tom' , 'Smith' , 'SuiXin' , 'Make' ] for j in range (len (name)): ws.write(j + 1 , 0 , name[j]) wb.save('test.xls' )
结果:
使用xlutils
修改xls文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import xlrdfrom xlutils.copy import copyrd_book = xlrd.open_workbook('test.xls' ) wt_book = copy(rd_book) ws = wt_book.get_sheet('S1' ) age = [32 , 38 , 24 , 40 ] for j in range (len (age)): ws.write(j + 1 , 1 , age[j]) wt_book.save('test_new.xls' )
结果:
参考
https://juejin.im/entry/5b3b2c7d6fb9a04fe820c5a3 https://blog.csdn.net/sinat_28576553/article/details/81275650 https://zhuanlan.zhihu.com/p/35605282