赞
踩
1.open(file, mode='r', buffering=-1, encoding=None, errors=None,
newline=None, closefd=True, opener=None)
file:文件路径(只写名称则为当前路径)
mode:文件打开权限,默认为r(只读)
buffering:参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。
Encoding:参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。
常用文件模式:
b 二进制模式(可与其他模式组合使用) |
+ 读、写模式(可与其他模式组合使用) |
r 只读 |
rb 二进制格式打开只读 |
r+ 读写(存在文件) |
rb+ 二进制格式读写 |
w 写入(存在文件时更新文件,原数据会不见;文件不存在,新建文件) |
wb 二进制读写 |
w+ 读写(存在文件时更新文件,原数据会不见;文件不存在,新建文件) |
wb+ 二进制读写(存在文件更新;文件不存在,新建文件) |
a 打开文件进行追加,存在内容,追加内容;不存在,创建文件(指针在文末) |
a+ 打开文件进行读写, 存在内容,追加内容;不存在,创建文件(指针在文末) |
例子1:
#coding=utf-8
foo=open(R'D:\123.txt',mode='r+',encoding='utf-8',buffering=1)
#编码格式必须与文件的编码格式一致 R/r:特殊符不转义
print(foo.name)
>>> D:\123.txt
2.读取文件
read(字符串数量) 读取字符串
readline() 该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件
readlines() 读取多行,大文件占内存
例1:
#coding=utf-8
foo=open(R'D:\123.txt','r+')
text01=foo.read(5)
print(text01)
>>第一行
>>第
例2:
#coding=utf-8
foo=open(R'D:\123.txt','r+')
text02=foo.readline()
while len(text02)!=0:
print(text02)
text02=foo.readline()
>>第一行
>>
>>第二行
>>
>>第三行
例3:
#coding=utf-8
foo=open(R'D:\123.txt','r+')
text03=foo.readlines()
for text in text03:
print(text)
print(len(text03))
foo.close()
>>第一行
>>
>>第二行
>>
>>第三行
>>3
3.写文件
#coding=utf-8
foo=open(R'D:\123.txt','w')
print(foo.write('hello,world!'))
foo=open(R'D:\123.txt','r')
print(foo.read())
foo=open(R'D:\123.txt','a')
print(foo.write('welcome!'))
foo=open(R'D:\123.txt','r')
print(foo.read())
>>12
>>hello,world!
>>8
>>hello,world!welcome!
--------------------
foo=open(R'D:\123.txt','r')
print(foo.readline())
>>>hello,world!
foo=open(R'D:\123.txt','r')
print(foo.readlines())
>>['hello,world!\n', 'welcome!']
4.关闭文件
#coding=utf-8
foo=open(R'D:\123.txt','r')
try:
print(foo.read())
finally:
foo.close()
5.重命名 rename
#coding=utf-8
import os
os.rename(R'D:\123.txt',R'D:\abc.txt')
6.删除文件 remove
#coding=utf-8
import os
try:
os.remove(R'D:\abc.txt')
except Exception:
print('file no found')
7.迭代
例1:
#coding=utf-8
foo=open(R'D:\123.txt','w+')
print(foo.write('hello'))
foo=open(R'D:\123.txt','r')
text=foo.read(1)
while text:
print(text)
text=foo.read(1)
foo.close()
>>5
>>h
>>e
>>l
>>l
>>o
例2:
#coding=utf-8
foo=open(R'D:\123.txt','r')
while True:
text=foo.readline(1)
if not text:
break
print(text)
foo.close()
>>h
>>e
>>l
>>l
>>o
8.序列化和反序列化
序列化:将数据结构或对象转化为二进制数据
反序列化: 二进制数据转化为数据结构或对象
pickle.dump(obj,file) 将对象转化为二进制
例1: 序列化
#coding=utf-8
import pickle
test = dict(name='xiaozhi',num =1002)
print(pickle.dumps(test))
try:
f_name = open(R'D:\abc.txt','wb')
pickle.dump(test,f_name)
finally:
f_name.close()
>>>>>>b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x07\x00\x00\x00xiaozhiq\x02X\x03\x00\x00\x00numq\x03M\xea\x03u.'
例2: 反序列化(pickle.load())
#coding=utf-8
import pickle
try:
f_name = open(R'D:\abc.txt','rb')
print(pickle.load(f_name))
finally:
f_name.close()
>>>>> {'name': 'xiaozhi', 'num': 1002}
9.调试
repr() 可接受任何对象做参数(包括空格,制表符和换行符)
test = '1 2\t3\n 45'
print(test)
print(repr(test))
>>>1 2 3
>>> 45
>>>'1 2\t3\n 45'
10.with语句
实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with可以自动管理资源,不论因为什么原因(哪怕是代码引发了异常)跳出with块,总能保证文件被正确关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的上下文,常用于文件操作、数据库连接、网络连接、多线程与多进程同步时的锁对象管理等场合.
基本语法:with: open(filename, mode, encoding) as fp:
例1: 统计文本文件中最长行的长度和该行的内容
with open('sample.txt') as fp: #假设文件采用CP936编码
result = [0, '']
for line in fp: #文件对象可以直接迭代
t = len(line)
if t > result[0]:
result = [t, line]
print(result)
例2:
def fileCopy(src, dst, srcEncoding, dstEncoding):
with open(src, 'r', encoding=srcEncoding) as srcfp:
with open(dst, 'w', encoding=dstEncoding) as dstfp:
dstfp.write(srcfp.read())
例3: 将其中第13、14两个字符修改为测试
with open('sample.txt', 'r+') as fp:
fp.seek(13)
fp.write('测试')
例4: 使用标准库json进行数据交换
import json
with open('test.txt', 'w') as fp:
json.dump({'a':1, 'b':2, 'c':3}, fp) #写入文件
with open('test.txt', 'r') as fp:
print(json.load(fp)) #从文件中读取
{'a': 1, 'b': 2, 'c': 3}
12. shelve(二进制文件操作)
跟open()一起使用,接收一个参数就是文件名,并且文件名必须是.bat类型的。然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭(shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。)
import shelve zhangsan = {'age':38, 'sex':'Male', 'address':'SDIBT'} lisi = {'age':40, 'sex':'Male', 'qq':'1234567', 'tel':'7654321'} with shelve.open('shelve_test.dat') as fp: fp['zhangsan'] = zhangsan # 像操作字典一样把数据写入文件 fp['lisi'] = lisi for i in range(5): fp[str(i)] = str(i) with shelve.open('shelve_test.dat') as fp: print(fp['zhangsan']) # 读取并显示文件内容 print(fp['zhangsan']['age']) print(fp['lisi']['qq']) print(fp['3'])
{'age': 38, 'sex': 'Male', 'address': 'SDIBT'} 38 1234567 3
13. openpyxl 读写Excel 2007以及更高版本的文件
import shelve import openpyxl from openpyxl import Workbook fn = r'test.xlsx' #文件名 wb = Workbook() #创建工作簿 ws = wb.create_sheet(title='你好,世界') #创建工作表 ws['A1'] = '这是第一个单元格' #单元格赋值 ws['B1'] = 3.1415926 wb.save(fn) #保存Excel文件 wb = openpyxl.load_workbook(fn) #打开已有的Excel文件 ws = wb.worksheets[1] #打开指定索引的工作表 print(ws['A1'].value) #读取并输出指定单元格的值 ws.append([1,2,3,4,5]) #添加一行数据 ws.merge_cells('F2:F3') #合并单元格 ws['F2'] = "=sum(A2:E2)" #写入公式 for r in range(10,15): for c in range(3,8): ws.cell(row=r, column=c, value=r*c) #写入单元格数据 wb.save(fn)
14. docx文档
例1: 检查word文档的连续重复字
from docx import Document doc = Document('《Python程序设计开发宝典》.docx') contents = ''.join((p.text for p in doc.paragraphs)) words = [] for index, ch in enumerate(contents[:-2]): if ch==contents[index+1] or ch==contents[index+2]: word = contents[index:index+3] if word not in words: words.append(word) print(word)
例2: 提取docx文档中例题、插图和表格清单
from docx import Document import re result = {'li':[], 'fig':[], 'tab':[]} doc = Document(r'C:\Python可以这样学.docx') for p in doc.paragraphs: #遍历文档所有段落 t = p.text #获取每一段的文本 if re.match('例\d+-\d+ ', t): #例题 result['li'].append(t) elif re.match('图\d+-\d+ ', t): #插图 result['fig'].append(t) elif re.match('表\d+-\d+ ', t): #表格 result['tab'].append(t) for key in result.keys(): #输出结果 print('='*30) for value in result[key]: print(value)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。