一,文件处理流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件

二,文件打开模式

  1. r只读 (默认打开模式是只读)
  2. w只写
  3. a追加

三,文件操作实例

   1.r读

    read读取文件所有内容 vim day17-2.py  文件a为一段文本

#因为使用的是windows客户端默认的是gbk编码,open默认使用系统编码,这里需要指定打开的编码方式为utf-8
f = open('a','r',encoding='utf-8')
#读取全部赋值给变量data
data = f.read()
#打印data内容输出为所有内容
print(data)

When we asks parents for money and for other things,
we are so naturally to do it and without thinking too much.
If our parents refuse, we will be angry.
But the fact is that they don’t owe us, instead,
we owes them and most of us don’t know the meaning of gratitude.

    readline一行行读取文件内容vim day17-3.py readline是一行行读取,读取到最后一行以后再往下读取则为空

#因为使用的是windows客户端默认的是gbk编码,open默认使用系统编码,这里需要指定打开的编码方式为utf-8
f = open('a','r',encoding='utf-8') #print(f.readable())
#最后加参数end为空就不会在打印的时候出现换行
#readline一次读取一行
#readlines读取多行以行为元素返回一个列表
print('第一行',f.readline(),end='')
print('第二行',f.readline())
print('第三行',f.readline())
print('第四行',f.readline())
print('第五行',f.readline())
print('第六行',f.readline())
#最后记得关闭
f.close() 第一行 When we asks parents for money and for other things,
第二行 we are so naturally to do it and without thinking too much. 第三行 If our parents refuse, we will be angry. 第四行 But the fact is that they don’t owe us, instead, 第五行 we owes them and most of us don’t know the meaning of gratitude. 第六行

    readable查看是否可读取,可读取返回True,不可读取返回False

f = open('a','r',encoding='utf-8')

print(f.readable())

True

  2,w写

    如果加入参数w则在运行的时候会首先把文件内容清空,如果文件不存在会新建一个文件vim  day17-4.py

f = open('a','w',encoding='utf-8')
f.write('1111\n')
f.write('2222\n')
f.close()

    运行则文件a内容清空 写入1111和2222,写操作不会换行需要换行必须加入\n

  PS:读写都是以字符串的数据模式不能是其他任何数据类型

  3,a追加vim  day17-5.py 在文件尾部追加‘写到文件最后’字符串,原字符串保留原样。

f = open('a','a',encoding='utf-8')
f.write('写到文件最后')

  4,r+ 读写 vim day17-6.py 可以打印出原文件内容并且不换行继续添加字符串

f = open('a','r+',encoding='utf-8')
data=f.read()
print(data)
f.write('123')

  如果上面没有data=f.read()这一步直接f.write会从文件开头位置写入并且覆盖从头开始的内容

  5,修改文件假如文件a里面有两行内容aaa和bbb需要删除bbb

#以只读模式打开文件a
src_f = open('a','r',encoding='utf-8')
#读取成一个列表的方式赋值给data
data = src_f.readlines()
src_f.close() #以写的模式打开一个新文件 没有及生成
dst_f = open('a_new','w',encoding='utf-8')
#把第一行写入文件
dst_f.write(data[0])
dst_f.close()
#print(data)

  

  文件处理最后需要使用close关闭,可以使用with打开则不需要每次关闭,程序会自动关闭

with open('a','w') as f:
f.write('1111\n')

  

四,文件处理b模式

  1,以二进制模式读取文档vim day17-9.py

#使用二进制打开不能指定编码方式,否则报错
f=open('test11.py','rb')
data=f.read()
print(data) b'hello1\r\n22222\r\n33333\r\n4444'

  PS:在linux中回车使用\n表示在windows中使用\n\r表示

 2,通过解码把二进制编码成原文档

#使用二进制打开不能指定编码方式,否则报错
f=open('test11.py','rb')
data=f.read()
print(data.decode('utf-8'))

hello1
22222
33333
4444
你好好好

  3,通过二进制编码写入vim day17-10.py

f=open('test22.py','wb')
f.write(bytes('222\n',encoding='utf-8'))

  PS:写入不能直接写入字符串格式,必须先把字符串以utf-8的格式转换成二进制格式然后写入

  直接在字符串前面加b也可以(这样值适用于字符和数字如果是中文不可以,还是使用bytes)

f=open('test22.py','wb')
f.write(b'222\n')

  直接对字符串使用encode方法也可以

f=open('test22.py','wb')
x='zhangsan'
f.write(x.encode('utf-8'))

  4,从文件最后的位置往后写参数ab

f=open('test22.py','ab')
x='zhangsan'
f.write(x.encode('utf-8'))

 

PS:为什么要使用二进制方式处理文件,因为python默认使用t文本处理,但是不是所有文件都是文本格式可能有其他格式,所以需要使用二进制方式来处理。

五,文件操作的其他方法

  1,flush 刷新数据到磁盘,类似于文件的保存操作。不能在PyCharm里面演示,可以在python终端演示,写入返回值为光标位置,没有执行flush就不会

    写入到磁盘,可以打开另外一个终端查看

>>> f=open('test.txt','w')
>>> f.write('11111\n')
6
>>> f.flush()

  2,tell取光标当前位置

f=open('a.txt','r+',encoding='utf-8')
print(f.tell())
f.readline()
print(f.tell()) 0
9

  开始光标在位置0读取了一行以后光标位置位于9

  3,encoding显示编码(非原文件编码而是打开文件的编码)

f=open('a.txt','r+',encoding='utf-8')
print(f.encoding) utf-8

  4,newline参数读取文件中真正的换行符号

f=open('a.txt','r',encoding='utf-8')
print(f.readlines()) ['你好\n', '你好']

  此列为windows里面的python自动把换行符转换成\n,如果需要读取真正的windows下面的换行符加参数newline

f=open('a.txt','r',encoding='utf-8',newline='')
print(f.readlines()) ['你好\r\n', '你好']

  5,seek控制光标的移动,开始光标位置为0读取一行一行位置为8使用seek方法又放置在0位置

f=open('a.txt','r',encoding='utf-8')
print(f.tell())
f.readline()
print(f.tell())
f.seek(0)
print(f.tell()) 0
8
0

  PS:seek是以字节为单位的,假如文件含有中文seek到位置1,因为一个中文是3个字节所以打印会出现错误。如果是英文因为英文一个字符就是一个字节所以打印不会报错。

f=open('a.txt','r',encoding='utf-8')
print(f.tell())
f.readline()
print(f.tell())
f.seek(1)
print(f.tell())
print(f.readlines())

  read(3)代表读取3个字符(一个中文代表一个字符一个英文也代表一个字符),其余的文件内光标移动都是以字节为单位如seek,tell,read,truncate

  6,truncate截取,以可写方式打开从头开始截取多少个字节

f=open('a.txt','r+',encoding='utf-8')
f.truncate(10)

  7,seek的方法补充

    seek指定位置的方式是从0绝对值开始指定的day17-12.py 默认对比位置是0不需要加0参数及默认

#打开文件
f=open('seek.txt','rb')
#打印位置为0
print(f.tell())
#指定位置10所以打印为0
f.seek(10)
print(f.tell())
f.seek(3)
print(f.tell()) 0
10
3

  参数1代表相对位置相对于上一次光标停留的位置day17-13.py

#打开文件
f=open('seek.txt','rb')
#打印位置为0
print(f.tell())
#指定位置10相对上一次光标的位置所以打印为10
f.seek(10,1)
print(f.tell())
#指定位置3相对上一次光标的位置所以打印为13
f.seek(3,1)
print(f.tell()) 0
10
13

  参数2代表从文件末尾开始seek相当于倒序day17-14.py

#打开文件,因为seek是用字节所以要以二进制方式打开
f=open('seek.txt','rb')
#打印位置为0
print(f.tell())
#从末尾seek5个字符
f.seek(-5,2)
print(f.tell()) 0
18

  seek.txt的内容为

hello
你好
123
123

  从后往前倒数5个是123以及第3行末尾的\r\n 然后在从前往后数hello + \r\n 7个字节 你好+|\r\n 8个字节 123 3个字节所以位置是18

  PS:使用参数2前面倒序的数字必须是负数否则seek的位置不正常

    上面后面使用read方法读取出来的内容为 b'\r\n123'

seek参数2的作用,假如是读取日志文件最后一行可以使用以下方法day17-15.py

f=open('日志文件','rb')
data=f.readlines()
print(data[-1].decode('utf-8'))

  但是使用以上方法会一次性把所有内容读取到内存造成内存的浪费,下面使用seek方法实现day17-16.py

f=open('日志文件','rb')

for i in f:
#定义偏移量
offs=-10
while True:
#从后往前面读取偏移量的字节
f.seek(offs,2)
#一次性读取从光标位置往后的内容生成一个列表如果
data=f.readlines()
#如果列表长度大于1则代表至少读取到了两行则取最后一行并且结束无限循环
if len(data) > 1:
print('文件的最后一行是%s' %(data[-1].decode('utf-8')))
break
#如果列表长度不满足要求既等于1则加大偏移量再从后往前读取一次
offs*=2 2017-01-05 xxx做了什么事情

  

Python全栈day17(文件处理)的更多相关文章

  1. python全栈开发从入门到放弃之迭代器生成器

    1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable  可迭代的 可迭 ...

  2. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  3. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  4. Python全栈【异常处理】

    Python全栈[异常处理] 本节内容: 1.异常处理 2.什么时候用异常处理 异常处理 1.异常处理: 异常就是程序运行时发生错误的信号,异常处理是在编程过程中为了增加友好性,在程序出现bug时一般 ...

  5. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  6. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  7. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  8. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  9. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

随机推荐

  1. shell监控脚本实例—监控mysql主从复制

    分享一例shell脚本,用于监测mysql数据库的主从复制,有需要的朋友不妨参考学习下. 转自:http://www.jbxue.com/article/14103.html(转载请注明出处) 本节内 ...

  2. 源码分析:Java堆的创建

    虚拟机在内存中申请一片区域,由虚拟机自动管理,用来满足应用程序对象分配的空间需求,即堆空间. 由于程序运行的局部特性,程序创建的大多数对象都具有非常短的生命周期,而程序也会创建一些生命周期特别长的对象 ...

  3. 在编写JSP的时候出现XXX cannot be resolved to a type

    今天遇到这个情况,却发现是eclipse抽风,说javax.servlet.http.Cookie找不到定义,但是经过浏览器测试,可以运行,而JSP源文件中eclipse死活要报错.表示无语. 关于e ...

  4. Js 省市联动

    function cn(){ this.Items = {}; } cn.prototype.add = function(id,iArray){ this.Items[id] = iArray; } ...

  5. 悦铃文件必须是CCITT A_Law格式的,且没有被压缩

    最近在给公司弄来电彩铃,用的是电信的“悦铃”业务,办理过程不想多说了..给了我个网址和账号让我登录,登录界面惨不忍睹,感觉电信根本没有要宣传这项业务的意思,像是粗制滥造外包赶工做出来的.. 当然这不是 ...

  6. NSURLErrorDomain Code=-999(转)

    原文:http://www.henishuo.com/nsurlerrordomain-code-999/ 前言 今天有一个线上bug,是分配给提供H5的团队的,但是后台查不出来原因.于是让前端iOS ...

  7. Android——Activity生命周期(转)

    Activity生命周期   子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细 ...

  8. mongdb 慢查询

    查看mongodb慢查询 赶紧打开服务器爸爸,开慢查询,看下耗时500ms以上的都是些啥: db.setProfilingLevel(2,500) 看下最近的10条具体的慢查询指令: db.syste ...

  9. EasyUI 另一种form提交方式

    (function ($) { window.XW = {}; //全局系统对象 //异步请求统一调用方法 XW.ajax = function (options, param, callback) ...

  10. lmbench

    lmbench作为性能检测工具的一种,提供内存,网络,内核等多方面的测试工具.是benchmark众多功能测试软件中的一种.几天了解了下,记录于此. 参考链接 http://www.bitmover. ...