python课堂整理18---文件操作(下)
一、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---文件操作(下)的更多相关文章
- python课堂整理17---文件操作(上)
1.在同一目录下新建文本文件 “爱了” 2.在该文件下写入内容,同时留意pycharm右下角的编码格式为 utf- 8 3.下面程序中的read函数会索引系统默认的编码格式,winx下是gbk ,所以 ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
- 真香!Python十大常用文件操作,轻松办公
日常对于批量处理文件的需求非常多,用Python写脚本可以非常方便地实现,但在这过程中难免会和文件打交道,第一次做会有很多文件的操作无从下手,只能找度娘. 本篇文章整理了10个Python中最常用到的 ...
- python学习笔记-(七)python基础--集合、文件操作&函数
本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...
- python 函数初识和文件操作
文件操作 打开文件:文件句柄 = open('文件路径', '模式') 打开文件的模式 w #以写的方式打开 (不可读,不存在则创建,存在则删除内容) a #以追加的模式打开(可读, 不存在则创建 ...
- Python 字符编码及其文件操作
本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...
- Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法
知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...
- python基础学习笔记——文件操作
文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...
随机推荐
- jquery中的ajax应用集锦
一,原生JS实现ajax: 1 2 3 4 5 6 7 8 9 10 11 function AjaxGet() { var xhrObj; ...
- 移动端数据爬取和Scrapy框架
移动端数据爬取 注:抓包工具:青花瓷 1.配置fiddler 2.移动端安装fiddler证书 3.配置手机的网络 - 给手机设置一个代理IP:port a. Fiddler设置 打开Fiddler软 ...
- 302Java_前定义
第零章 前定义 1 介绍 1.1 简介 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. ...
- TCP UDP socket http webSocket 之间的关系
---恢复内容开始--- OSI&TCP/IP模型 要弄清tcp udp socket http websocket之间的关系,首先要知道经典的OSI七层模型,与之对应的是TCP/IP的四层模 ...
- 【fullGC】内存监控工具
什么是fullGC: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的J ...
- 【工具】java发送GET、POST请求
前项目使用这种HTTP的方式进行数据交互,目前已更换数据交互方式,但是作为接口提供调用来说还是比较简洁高效的: 总体流程就是: 1.发送HTTP请求 2.获取返回的JSON对象 3.JSON转换 pa ...
- laravel-admin(自定义表单与验证)
场景: 很多时候,由于我们业务场景比较特殊,需要自定义表单,然后框架给我提供了对应表单组建! 案列:以创建一个字段为列 1.在控制器对应的方法中调用表单组建创建表单 public function c ...
- 基于STM32之UART串口通信协议(一)详解
一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...
- K2工作流引擎Demo
---恢复内容开始--- 以前的工作都是电商网站形式的,从未接触过工作流相关工作,新公司是传统制造业行业,我进的这个组又是做工作流这块相关工作的,所以避免不了和工作流打交道. 这边工作流主要用K2来做 ...
- oraclesql遇见的问题(一)
在oracle的数据库,对于字段为null的字段过滤条件只能用is null 或者 is not null,不能使用 != , <> , = 判断, 今天进行接口测试时,发现获取到的数据缺 ...