python二进制读取文件快速定位及半个中文字符问题处理

1. 打开文件快速定位读取的方法

在Python中,可以使用open()函数来打开文件。要快速定位到特定的字节位置并读取或写入内容,可以结合使用seek()方法。

下面是一个示例代码,展示了如何使用seek()方法在二进制模式下打开文件并快速定位到指定位置:

# 打开文件(以二进制模式)
file = open("filename.txt", "rb")# 将光标移动到第10个字节处
file.seek(9)# 从当前位置开始读取5个字节
data = file.read(5)
print(data)# 关闭文件
file.close()

上述代码首先通过open()函数以二进制模式(“rb”)打开名为filename.txt的文件。然后,使用seek()方法将文件指针移动到第10个字节处。接下来,使用read()方法从当前位置开始读取5个字节的数据,并将其存储在变量data中。最后,使用close()方法关闭文件。

2. 读取大日志文件最后一行及所遇到的问题

快速定位读取文件最后一行的解决方案,是通过seek()将文件指针移动到文件末尾,再移动文件指针到某个位置(offset),字符数大于最后一行的字符数量,再按行读取,基本上是最后两行数据。

截取部分代码如下,其中,每行数据也就100多个字符。

        with open(filename, 'rb') as file:offset = -150                   # initialize offsetfile.seek(offset, 2)            # 将文件指针移动到文件末尾binary_data = file.readlines()for v in binary_data:last_line.append(v.decode('utf-8'))  # 假设编码方式为utf-8if len(last_line)>=2:now_line = last_line[-1]file.close()print(now_line)

运行起来,没啥问题。

突出日志中爆出了问题:

'utf-8' codec can't decode byte 0xba in position 0: invalid start byte

经分析,恍然大悟!是中文双字节问题!读取字节流时,遇到中文时,出现截取半个中文的问题。解决方案是抓取字符编码异常,去掉字节流首个字节,也就去掉半个汉字。

在Python中,一个字节可以表示一个ASCII字符,而对于双字节字符(如中文字符),通常使用Unicode编码。在Python 3中,字符串默认使用Unicode编码,因此可以直接处理中文字符而不需要考虑字节表示的问题。

如果你遇到了处理字节字符的问题,可能是因为你在处理字节数据而不是字符串数据。在处理字节数据时,需要注意字符编码的问题。在读取文件或者网络数据时,数据可能以字节流的形式呈现,这时你需要使用正确的字符编码来解码字节数据为字符串。

要从字节流中截取部分数据,可以使用切片操作符[]。切片操作可以通过指定起始索引和结束索引来提取字节流的一部分。

        with open(filename, 'rb') as file:offset = -150                   # initialize offsetfile.seek(offset, 2)            # 将文件指针移动到文件末尾binary_data = file.readlines()# 处理半个中文字符问题try:tmp = binary_data[0].decode('utf-8')except Exception as e:logger.warning("文件编码问题:{}" , e)kk = binary_data[0][2:]binary_data[0] = kkfor v in binary_data:last_line.append(v.decode('utf-8'))  # 假设编码方式为utf-8if len(last_line)>=2:now_line = last_line[-1]file.close()print(now_line)

3. 相关技术参考

3.1. seek函数的基本用法

在Python中,文件对象的seek方法用于移动文件读取/写入的指针到指定位置。其基本语法如下:

python复制代码file.seek(offset[, whence])
其中,offset表示相对于whence指定位置的偏移量(字节数)。whence参数可选,默认为0,其取值和意义如下:

0:表示文件开头,offset必须为正数(或零,表示文件开始位置)。

1:表示当前位置,offset可为正数(向后移动)或负数(向前移动)。

2:表示文件结尾,offset必须为负数(或零,表示文件结尾位置)。

3.2. seek函数对文件操作的影响

使用seek函数可以灵活地改变文件指针的位置,从而实现文件的随机访问。这在处理大文件或需要跳跃式读取文件的场景中非常有用。需要注意的是,seek函数不会改变文件内容,它只是移动了文件指针的位置。此外,使用seek函数时需要确保文件以二进制模式打开,否则可能会出现意想不到的错误。

需要注意的是,对于文本文件,由于其编码方式(如UTF-8)可能导致一个字符占用多个字节,因此在使用seek函数时需要谨慎处理,以免出现乱码或读取错误的情况。建议使用二进制模式打开文件,并按字节进行操作。

3.3. bytes对象

在Python中,bytes对象是不可变的字节序列,用于表示原始的二进制数据。bytes对象由一系列字节组成,每个字节的取值范围是0到255(即一个字节表示的是0到255之间的整数)。在内存中,bytes对象以一种紧凑的方式存储字节数据。

以下是创建bytes对象和基本使用的示例:

byte_data = b'hello'  # 在字符串前面加上b表示这是一个bytes对象byte_data = bytes([104, 101, 108, 108, 111])  # 将一个字节列表传递给bytes()函数byte_data = b'\x68\x65\x6c\x6c\x6f'  # 使用16进制表示字节

bytes对象支持多种操作和方法,包括索引访问、切片、拼接、比较等。以下是一些常见的操作:

byte_data = b'hello'
print(byte_data[0])  # 访问第一个字节,输出104
print(byte_data[:3])  # 截取前三个字节,输出b'hel'byte_data1 = b'hello'
byte_data2 = b'world'
combined_data = byte_data1 + byte_data2
print(combined_data)  # 输出b'helloworld'if byte_data1 == byte_data2:print('Equal')
else:print('Not equal')

bytes对象常用于处理二进制数据,比如读取文件、处理网络数据、加密算法等。在与网络、文件系统和硬件交互时,常常需要使用bytes对象来表示原始数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.Doris数据导入导出

导入 Doris支持多种数据源导入如S3 HDFS Kafka 本地文件 Binlog 等 官方文档 导入的原子性保证 Doris 的每一个导入作业,不论是使用 Broker Load 进行批量导入,还是使用 INSERT 语句进行单条导入,都是一个完整的事务操作。导入事务可以保证…

兰陵Ex导出(<c:improt>标签覆盖问题)

1.同一个页面单个导出 1.1 增加导出按钮 找到对应的页面&#xff0c;导出按钮增加在合适的位置&#xff0c;【count】关键字可调整排序。 <div style"display: inline-block; float:right;vertical-align: middle;"><ui:toolbar id"toolbarOperate&quo…

双面墨水屏电子桌牌:传统纸质桌牌的完美替代品

今天&#xff0c;中科慧显想要和大家分享的是&#xff0c;关于双面墨水屏电子桌牌在实际使用场景中的优势及好处。随着科技的快速发展&#xff0c;各种新型的电子办公产品不断涌现&#xff0c;其中双面墨水屏电子桌牌就是一种具有创新性的电子办公产品。相较于传统的纸质桌牌&a…

OpenCV图像的基本操作

图像的基本操作&#xff08;Python&#xff09; 素材图 P1&#xff1a;die.jpg P2&#xff1a;cool.jpg V&#xff1a;rabbit.mp4&#xff0c; 下载地址 读取展示-图像 import cv2img_1 cv2.imread(./die.jpg) # default cv2.IMREAD_COLOR print("die.jpg shape(imre…

2024年生物技术与医学科学国际学术研讨会(ISBAMS 2024)

2024年生物技术与医学科学国际学术研讨会&#xff08;ISBAMS 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.isbams.com会议地址&#xff1a;上海召开日期&#xff1a;2024/2/20截稿日期&#xff1a;2024/2/10 &#xff08;先投稿&#xff0c;先审核&#xff0c;先…

jmeter接口自动化测试工具在企业开展实际的操作

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

31.【TypeScript 教程】混入(Mixins)

TypeScript 混入(Mixins) 混入&#xff08;Mixins&#xff09;是面向对象编程中的一个比较重要的概念。本节将会通过一个实例逐步介绍混入是如何在 TypeScript 中使用的。 1. 解释 在 TypeScript 中&#xff0c;可以根据不同的功能定义多个可复用的类&#xff0c;它们将作为 …

【python】爬取豆瓣影评保存到Excel文件中【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 【往期相关文章】 爬取豆瓣电影排行榜Top250存储到Excel文件中 爬取豆瓣电影排行榜TOP250存储到CSV文件中 爬取知乎热榜Top50保存到Excel文件中 爬取百度热搜排行榜Top50可视化 爬取斗鱼直播照片保存到本地目录 爬…

仓储管理系统——软件工程报告(详细设计)④

详细设计 一、系统功能模块的划分 根据系统的功能性需求&#xff0c;本文将部队仓库管理系统分为以下六大模块&#xff1a;系统管理模 块、基础数据模块、出入库管理模块、库存管理模块、仓库信息管理模块、作业管理模 块&#xff0c;每个模块内部又分为很多小功能模块&#…

win10+elasticsearch8.12 安装教程

Elasticsearch是一种搜索引擎&#xff0c;本地安装完成之后&#xff0c;可使用其他编程语言&#xff08;例如python&#xff09;与elasticsearch建立连接&#xff0c;然后使用python脚本搜索elasticsearch中的数据 1下载 elasticsearch elasticsearch最新版官网下载链接 点击…

颠覆式创新:LAXCUS分布式操作系统7.0

在这轮AI浪潮中&#xff0c;英伟达已经获得了硬件算力入口&#xff0c;Laxcus要获取软件算力入口。 有几位网友想了解我们正在研发的Laxcus分布式操作系统7.0的情况。应他们要求&#xff0c;今天就说说Laxcus 7.0版本。Laxcus 7.0是一个全新的操作系统&#xff0c;具有很多独特…

Redis在生产环境中可能遇到的问题与解决方案(一)

Redis是一款高性能的内存数据库&#xff0c;广泛应用于生产环境中&#xff0c;但在实际应用中也会遇到一些问题。本文将详细探讨Redis在生产环境中可能遇到的问题&#xff0c;并提供相应的解决方案&#xff0c;以确保系统的稳定性和性能。 1. 内存耗尽 问题描述 在高负载情况…

uni-app 国际化

vue i18n v9的迁移后的$t()无法获取数组、对象 http://t.csdnimg.cn/WkCHy api:vue i18n [intlify] Not found ‘language’ key in ‘zh-Hans’ locale messages. [intlify] Fall back to translate ‘language’ key with ‘zh’ locale. [intlify] Not found ‘languag…

快速数论变换NTT学习笔记

什么是NTT&#xff1f; 数论变换&#xff08;number-theoretic transform, NTT&#xff09;是离散傅里叶变换&#xff08;DFT&#xff09;在数论基础上的实现。 NTT是一种计算卷积的快速算法&#xff0c;FFT也是其中一种。 但是FFT具有一些实现上的缺点&#xff0c;举例来说&…

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题&#xff1f; 2.6. 内存对齐 2.7. 什么是内存泄露 …

ISO27001认证:企业与个人发展的必备之选

ISO27001认证&#xff0c;对于企业和个人来说&#xff0c;都具有极高的价值和重要性。作为国际权威的信息安全管理体系标准&#xff0c;它为企业提供了保障信息安全、防范风险和提升竞争力的有力工具。 &#x1f4bc;对企业的价值&#xff1a; ISO27001认证可以帮助企业满足国家…

【通过docker安装常用软件镜像】1.镜像 2.安装 redis,jdk,nginx

1)官网镜像网站 hello-world - Official Image | Docker Hub 2)安装镜像测试例子 Redis 1.查询redis [rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL redis …

安全产品与等级保护:匹配与选择指南

基本要求项测评项基本措施对应产品网络架构应保证网络各个部分的带宽满足业务高峰期需要&#xff1b;带宽管理流量控制系统应避免将重要网络区域部署在边界处&#xff0c;重要网络区域与其他网络区域之间应采取可靠的技术隔离手段&#xff1b;网络及安全设备配置访问控制策略防…

rancher和k8s接口地址,Kubernetes监控体系,cAdvisor和kube-state-metrics 与 metrics-server

为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数&#xff0c;比如&#xff0c;某个pod的内存使用异常高企 等等这样的异常状态&#xff08;虽然kubernetes有自动重启或者驱逐等等保护措施&#xff0c;但万一没有配置或者失效了呢&#xff09;&#xff0…

数智化招标采购平台核心功能采购监管系统能做到哪些管控?

郑州信源数智化招标采购平台系统研发商&#xff0c;覆盖全业务类型、全采购流程、全采购方式&#xff0c;核心系统需求计划、电子招投标、非招标管理、供应商管理、采购监管、基础库、订单协同、电子商城、大数据辅助决策等功能&#xff0c;重构采购业务流程&#xff0c;赋能政…