读写xls、xlsx
可使用open、xlrd/xlwt、openpyxl。重点介绍openpyxl。
openpyxl官方文档:http://openpyxl.readthedocs.io/en/stable/index.html
安装使用pip install openpyxl即可。
基本语法介绍:
- 写操作
- 创建工作簿
>>> from openpyxl import Workbook
>>> wb = Workbook()
image.gif
- 获取第一个工作表
>>> ws = wb.active
image.gif
- 创建工作表
>>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)
# or
>>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
image.gif
- 表名修改
>>>ws.title = "New Title"
image.gif
- 通过工作表名索引
>>> ws3 = wb["New Title"]
image.gif
- 获取工作表名字
(1)wb.sheetnames
(2)
>>> for sheet in wb:
... print(sheet.title)
image.gif
- 工作表复制
>>> source = wb.active
>>> target = wb.copy_worksheet(source)
image.gif
- 单元格索引
单单元格
>>> ws['A4'] = 4
image.gif
或者:
d = ws.cell(row=4, column=2, value=10)
image.gif
计数由1开始。
多单元格
>>> cell_range = ws['A1':'C2']
image.gif
- 行、列索引
>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]
image.gif
- 单元格内容添加
>>> for row in range(1, 40):
... ws1.append(range(600))
image.gif
可以实现每一行逐个单元格写入
- 遍历
遍历所有行/列:
使用tuple(ws.rows)/tuple(ws.columns)
>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
image.gif
遍历指定单元格:
使用iter_rows()/iter_cols()
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
image.gif
>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
... for cell in col:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>
image.gif
两种方法,遍历的元素相同,但是顺序不同。
遍历读值:
image.png
- 储存
>>> wb.save('balances.xlsx')
image.gif
保存更改之后,写操作完成。
2.读操作
- 读取
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
image.gif
- 获取已有的工作表
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']
image.gif
其他表索引、单元格索引操作与前面提到的相同,不再赘述。还有其他的一些函数与属性,比较少用,详见官方文档。
读写csv文件
可使用open、python内置csv库和pandas提供的read_csv方法。python提供的csv库已经可以满足大部分的文件处理需求,但是其实基于行的操作,read_csv可以配合pandas的一些数据处理方法使用,可以行、列双向操作,更加方便。本文中将重点介绍csv库,并提供一些read_csv方法相关介绍外链。
csv库
官方文档:https://docs.python.org/2/library/csv.html#module-csv
不需要另外安装,直接导入使用。
import csv
image.gif
-
读取
-
**reader(csvfile, dialect='excel', fmtparams)
csvfile,必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象,如果是文件对
象,打开时需要加"b"标志参数。
dialect,编码风格,默认为excel的风格,也就是用逗号(,)分隔,dialect方式也支持自定义,通过调用register_dialect方法来注册,下文会提到。
fmtparam,格式化参数,用来覆盖之前dialect对象指定的编码风格。
返回一个list,list的原始是文件的行内容。每一行也是一个list,list的元素是每个单元格。增减行与单元格可以通过list的操作进行。list的相关操作见:http://www.runoob.com/python/python-lists.html
一个例子:
>>> import csv
>>> with open('eggs.csv', 'rb') as csvfile:
... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
... for row in spamreader:
... print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
image.gif
例子中把每行中的内容,通过‘, ’分隔符连接了起来
注意:如果csvfile是一个文件对象,那么它必须用“b”标志打开(open('eggs.csv', 'rb'))
- 写入
writer(csvfile, dialect='excel', **fmtparams)
with open('t.csv','wb') as myFile:
myWriter=csv.writer(myFile)
myWriter.writerow([7,'g'])
myWriter.writerow([8,'h'])
myList=[[1,2,3],[4,5,6]]
myWriter.writerows(myList)
image.gif
'w'表示写模式。
首先open()函数打开当前路径下的名字为't.csv'的文件,如果不存在这个文件,则创建它,返回myFile文件对象。
csv.writer(myFile)返回writer对象myWriter。
writerow()方法是一行一行写入,writerows方法是一次写入多行。
注意:如果文件't.csv'事先存在,调用writer函数会先清空原文件中的文本,再执行writerow/writerows方法。
补充:除了writerow、writerows,writer对象还提供了其他一些方法:writeheader、dialect
参考:https://www.cnblogs.com/pyxiaomangshe/p/8026483.html
read_csv
官方文档 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
安装:pip install pandas
网友评论