一、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. Kafka笔记5

    Kafka使用zookeeper来维护集群成员的信息.每个broker都有一个唯一标识符,这个标识符可以在配置文件指定,也可以自动生成. 在broker停机,出现网络分区或者长时间垃圾回收停顿时,br ...

  2. 【oracle】Oracle整理笔记

    原博主总结了很多技能和小技巧,本人觉的非常实用,转载记录下: Oracle学习笔记整理手册 作者:@smileNicky 链接:https://blog.csdn.net/u014427391/art ...

  3. 开源joda-time使用demo

    开源joda-time 1.maven中引入 <dependency> <groupId>joda-time</groupId> <artifactId> ...

  4. Linux上安装Nginx依赖环境和库、Nginx安装,Nginx服务命令

    安装Nginx依赖环境和库.Nginx安装,Nginx服务命令 因为Nginx官方提供的是C源码,要自己进行编译,所以需要自己拥有编译所依赖的环境和库才可正常编译 安装gcc yum -y insta ...

  5. 记一次基于Cloudflare服务的爬虫

    前言 前几天有个朋友托我帮忙爬一个网站,第一次打开那个网站时,我去,它竟然就要验证码,不过当时是想加几个header应该就能解决,不过事实证明我还是错了.接下来将记录下爬虫中遇到的一些坑以及解决办法. ...

  6. 跟我学SpringCloud | 第八篇:Spring Cloud Bus 消息总线

    SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特 ...

  7. linux 多主机间快速跳转脚本

    #!/usr/bin/env python #coding=utf8 ''' 用于多机器间相互跳转,如有新机器加入,需要更新ip_list文件 ''' from prettytable import ...

  8. python数据库-安装问题总结(48)

    一.ERROR1698(28000):Access denied for user root@localhost错误 我的操作系统是ubuntu: 我的MySQL版本是: 安装完成后,登录mysql的 ...

  9. 每天学点node系列-fs文件系统

    好的代码像粥一样,都是用时间熬出来的. 概述 文件 I/O 是由简单封装的标准 POSIX 函数提供的. 通过 require('fs') 使用该模块. 所有文件系统操作都具有同步和异步的形式. 异步 ...

  10. Python编程菜鸟成长记--A1--01--编程语言介绍

    目录 1.重点知识 2.什么是编程?为什么要编程? 3.有哪些编程语言? 3.1.机器语言 3.2.汇编语言 3.3.高级语言 3.3.1.编译型语言 3.3.2.解释型语言 3.4.小结 4.主流编 ...