一、b模式,字节方式(二进制的单位),rb  wb  ab

f = open('test.py', 'rb', encoding = 'utf-8')

报错,因为用了b模式,就不能再指定编码格式了,已经指定读成二进制。

f = open('test.py', 'rb')
data = f.read()
print(data)

因为test文件内容是以utf-8的格式写入的,一个中文占三个字节

在Windows下,换行符就是 \r\n

#字符串------->转为二进制-------->硬盘

即:‘字符串’------>encode-------->bytes(编码过程)

  bytes-------->decode--------->'字符串'(解码过程)

解码:

f = open('test.py', 'rb')
data = f.read()
print(data.decode('utf8'))

编码:两种方法

x = 'hello'
b = bytes(x, encoding = 'utf-8')
x.encode('utf8')

f = open('test', 'wb')
f.write(bytes('一生所爱', encoding = 'utf-8'))

f = open('test22', 'wb')
f.write('我的欢喜'.encode('utf-8'))

注意:r w   其实都是默认成 rt   wt   ,只能用来打开文本格式,还有图片,视频等格式,所以要用  rb  wb  ab  这类,转换为二进制,也更适合跨平台。

二、文件操作的其他方法

f = open('a.txt', 'w', encoding = 'utf-8')
print(f.closed) #判断文件是否关闭了
print(f.encoding) #取的是文件打开的编码方式(即open里的)
f.write('你好') #写入文件用的是open里指定的编码方式
f.flush() #刷新,保存内容到硬盘
f.close()

f = open('b.txt', 'r', encoding = 'utf-8')
print(f.tell()) #光标当前所在位置
f.readline()
print(f.tell())

为什么是0和8呢,

seek, tell 等光标移动都是以字节为单位

首先刚打开文件,光标在起始位置,所以为 0

读了一行之后,因为utf- 8下,一个中文=3个字节,回车(\r\n)=2个字节,所以,3+3+2=8

############

f.seek(0)

控制光标到0位置

但要注意,中文等于多个字节,比如b.txt中,“你”=3个字节,不能把光标移到2,然后read,会报错,不能拆分中文字节

read(1): 读一个字符

print(f.read(1))

  

文件的截取

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

从0位置截取到10位置,按字节数,需要 r+ 或 a+ ,w+不行,会直接覆盖掉,相当于修改了文件,只保留截取的内容

在windows下,换行就是\r\n,但是python自动把\r\n换成了\n,想取消这一自动化操作,用:

f = open('b.txt', 'r', encoding = 'utf8', newline = '')
data = f.readlines()
print(data)
f.close()

三、seek的高级用法

seek后的第二个参数有三种:0, 1, 2

♦ 默认为0,即从起始位置移动光标

with open('b.txt', 'r+', encoding = 'utf-8') as f:
f.seek(3, 0)
print(f.read())
f.seek(0, 0)
f.seek(3)
print(f.read())

  

♦ 第二个参数为 1 时,表示从相对位置(相当于上次位置),要用文件打开的 b 模式(rb)

with open('b.txt', 'rb') as f:
f.seek(3)
print(f.tell())
f.seek(3, 1)
print(f.tell())

♦ 第二个参数为2 时,表示从文件末尾读(倒着seek),要用文件打开的 b 模式(rb),第一个参数需要用负数

with open('b.txt', 'rb') as f:
f.seek(-10, 2)
data = f.read()
print(data.decode('utf-8'))

练习:用seek读日志文件的最后一行

log.txt

2019年7月3日,刘文豪做了一件好事。
2019年7月4日,sb做了一件sb事。
2019年7月5日,大白做了一件好事。
2019年7月6日,家强做了一件好事。
2019年7月7日,傻叉做了一件坏事。
2019年7月8日,小仙女美美地打扮。
2019年7月9日,金灵在学习。
with open('log.txt', 'rb') as f:
for i in f:
offs = -20 #设置一个偏移量
while True:
f.seek(offs, 2)
data = f.readlines()
if len(data) < 2:
offs = offs * 2
if len(data) >= 2:
break
wan = data[-1]
print('日志最后一行为:',wan.decode('utf-8'))

python课堂整理18---文件操作(下)的更多相关文章

  1. python课堂整理17---文件操作(上)

    1.在同一目录下新建文本文件 “爱了” 2.在该文件下写入内容,同时留意pycharm右下角的编码格式为 utf- 8 3.下面程序中的read函数会索引系统默认的编码格式,winx下是gbk ,所以 ...

  2. Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...

  3. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  4. 真香!Python十大常用文件操作,轻松办公

    日常对于批量处理文件的需求非常多,用Python写脚本可以非常方便地实现,但在这过程中难免会和文件打交道,第一次做会有很多文件的操作无从下手,只能找度娘. 本篇文章整理了10个Python中最常用到的 ...

  5. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  6. python 函数初识和文件操作

    文件操作  打开文件:文件句柄 = open('文件路径', '模式')  打开文件的模式 w #以写的方式打开 (不可读,不存在则创建,存在则删除内容) a #以追加的模式打开(可读, 不存在则创建 ...

  7. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  8. Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法

    知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...

  9. python基础学习笔记——文件操作

    文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...

随机推荐

  1. 简单解说Linux命令输出与命令替换

    Linux命令能提高更方便的使用性能.下面就这就来讲术Linux命令.将一个程序或Linux命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上个 ...

  2. SYN6105型 GPS子钟

    SYN6105型 GPS子钟 产品概述 SYN6105型GPS子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套以接收GPS卫星信号的子钟,从GPS地球同步卫星上获取标准时钟信号信息将这些时 ...

  3. 记一次在win2008下添加nginx自启动服务的操作

    为了在win环境下添加nginx自启服务,我度娘了, 找到在cnblogs下(http://www.cnblogs.com/JayK/p/3429795.html)有篇文章是介绍如何添加nginx到w ...

  4. php __autoload 在有命名空间的时候失效(使用的局限性)

    如果要使用__autoload方法,则不能再之前使用namespace,    使用命名空间,则至少php5.3不再调用__autoload方法    因此如果需要使用__autoload和命名空间, ...

  5. 前端笔记之React(三)使用动态样式表&antd&React脚手架&props实战

    一.使用动态样式表 1.1 LESS使用 全局安装Less npm install -g less 创建1.less文件,然后可以用lessc命令来编译这个文件: lessc 1.less 1.css ...

  6. 你真的会用mysql行级锁吗?mysql 行级锁全解析

    在互联网大并发应用大行其道的今天,应用的开发总是离不开锁,在分布式应用中,最常见的莫过于基于数据库的行级锁了,由于互联网公司中比较主流的数据库还是mysql,所以这一话题绕不开的就是mysql了,但是 ...

  7. 02_javaSE面试题:单例设计模式

    还记得很多年前,面试就让在白板上写个单例模式,当时技术渣渣,还写的是class A.面试官还说,你就不能写个Singleton. 面试题 编程题:写一个Singleton示例 解析 什么是Single ...

  8. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  9. 【朝花夕拾】Android自定义View篇之(九)多点触控(下)实践出真知

    前言 在上一篇文章中,已经总结了MotionEvent以及多点触控相关的基础理论知识和常用的函数.本篇将通过实现单指拖动图片,多指拖动图片的实际案例来进行练习并实现一些效果,来理解前面的理论知识.要理 ...

  10. Linux命令学习-history命令

    Linux中,history命令的作用是显示历史记录和执行过的命令. 查看历史所有命令执行记录 history 查看最近的13条历史执行命令 history 13 执行历史记录中,序号为123的命令 ...