一、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. WSAAsyncSelect Demo

    #include <WinSock2.h> #include <Windows.h> #include <StrSafe.h> #pragma comment(li ...

  2. 注册表Demo

    一.获取安装程序信息 #include <windows.h> #include <iostream> #include <string> #include < ...

  3. 打开并锁定一个文件(使用LockFile API函数)

    var aHandle : THandle; aFileSize : Integer; aFileName : String; procedure TForm1.Button3Click(Sender ...

  4. 《C++ Primer》读书笔记 第一章

    读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...

  5. HDFS Java API 的基本使用

    一. 简介 二.API的使用         2.1 FileSystem         2.2 创建目录         2.3 创建指定权限的目录         2.4 创建文件,并写入内容 ...

  6. Storm 学习之路(二)—— Storm核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...

  7. Jenkins的安装与使用(一)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  8. Logback详细整理,基于springboot的日志配置

    Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...

  9. 思维导图xmind的使用方法

    什么是Xmind Xmind是一款简单好用的思维导图软件,除了可以轻松绘制基本逻辑图,还支持组织结构图(竖直).树状图(水平+竖直).思维导图(辐射).鱼骨图.二维图(表格)模型.免费版可以把思维导图 ...

  10. Web安全深度剖析

    Web安全深度剖析 链接:https://pan.baidu.com/s/15NulgWNzQ2JPCdn9q1jE-g 提取码:6y83    Web安全深度剖析>总结了当前流行的高危漏洞的形 ...