python3.5入门笔记(14) 文件

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)

 

 

 

 

 

 

 

发布了28 篇原创文章 · 获赞 1 · 访问量 3182

猜你喜欢

转载自blog.csdn.net/pdd51testing/article/details/84299082