Python基础(二十二):文件操作

文件操作

一、文件操作的作用

思考:什么是文件?

思考:文件操作包含什么?

答:打开、关闭、读、写、复制......

思考:文件操作的的作用是什么?

答:读取内容、写入内容、备份内容......

总结:文件操作的作用就是把⼀些内容(数据)存储存放起来,可以让程序下⼀次执行的时候直接使用,而不必重新制作⼀份,省时省力。

二、文件的基本操作

1、文件操作步骤

  • 打开文件
  • 读写等操作
  • 关闭文件

注意:可以只打开和关闭文件,不进行任何读写操作。

1.1、打开

在python,使用open函数,可以打开⼀个已经存在的文件,或者创建⼀个新文件,语法如下:

open(name, mode)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读、写入、追加等

打开文件模式

快速体验

f = open('test.txt', 'w') 1

注意:此时的 f 是 open 函数的文件对象。

1.2、文件对象方法

1.2.1、写

语法

对象对象.write('内容')

体验

# 1. 打开⽂件
f = open('test.txt', 'w')
# 2.⽂件写⼊
f.write('hello world')
# 3. 关闭⽂件
f.close()

注意: 1. w 和 a 模式:如果⽂件不存在则创建该⽂件;如果⽂件存在, w 模式先清空再写⼊, a 模式直接末尾追加。 2. r 模式:如果⽂件不存在则报错。

1.2.2、读

  • read()
⽂件对象.read(num)

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

  • readlines()

readlines可以按照行的方式把整个文件中的内容进行⼀次性读取,并且返回的是⼀个列表,其中每⼀行的数据为⼀个元素。

f = open('test.txt')
content = f.readlines()
# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)
# 关闭⽂件
f.close()

  • readline()

readline()⼀次读取⼀行内容。

f = open('test.txt')
content = f.readline()
print(f'第⼀⾏:{content}')
content = f.readline()
print(f'第⼆⾏:{content}')
# 关闭⽂件
f.close()

文件内容:

  • seek()

作用:用来移动文件指针。

语法如下:

⽂件对象.seek(偏移量, 起始位置)

起始位置:

  • 0:⽂件开头
  • 1:当前位置
  • 2:⽂件结尾

1.3、关闭

⽂件对象.close()

三、文件备份

需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。

1、步骤

  • 接收用户输入的文件名
  • 规划备份文件名
  • 备份文件写入数据

2、代码实现

2.1、接收用户输入目标文件名

old_name = input('请输⼊您要备份的⽂件名:')

2.2、规划备份文件名

  • 提取目标文件后缀
  • 组织备份的文件名,xx[备份]后缀
# 2.1 提取文件后缀点的下标
index = old_name.rfind('.')
# print(index) # 后缀中.的下标
# print(old_name[:index]) # 源文件名(⽆后缀)
# 2.2 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]
# 打印新文件名(带后缀)
# print(new_name)

2.3、备份文件写入数据

  • 打开源文件和备份文件
  • 将源文件数据写入备份文件
  • 关闭文件
# 3.1 打开⽂件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
# 3.2 将源⽂件数据写⼊备份⽂件
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)
# 3.3 关闭⽂件
old_f.close()
new_f.close()

3、思考

如果用户输入 .txt ,这是⼀个无效文件,程序如何更改才能限制只有有效的文件名才能备份?

答:添加条件判断即可。

old_name = input('请输⼊您要备份的⽂件名:')
index = old_name.rfind('.')
if index > 0:
    postfix = old_name[index:]
new_name = old_name[:index] + '[备份]' + postfix
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)
old_f.close()
new_f.close()

四、文件和文件夹的操作

在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:

导入os模块

import os

使用os模块相关功能

os.函数名()

1、文件重命名

os.rename(⽬标⽂件名, 新⽂件名)

2、删除文件

os.remove(⽬标⽂件名)

3、创建文件夹

os.mkdir(⽂件夹名字)

4、删除文件夹

os.rmdir(⽂件夹名字)

5、获取当前目录

os.getcwd()

6、改变默认目录

os.chdir(⽬录)

7、获取目录列表

os.listdir(⽬录)

五、应用案例

需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。

  • 步骤
  1. 设置添加删除字符串的的标识
  2. 获取指定目录的所有文件
  3. 将原有文件名添加/删除指定字符串,构造新名字
  4. os.rename()重命名
  • 代码
import os
# 设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1
# 获取指定⽬录
dir_name = './'
# 获取指定⽬录的⽂件列表
file_list = os.listdir(dir_name)
# print(file_list)
# 遍历⽂件列表内的⽂件
for name in file_list:
    # 添加指定字符
    if flag == 1:
        new_name = 'Python-' + name
    # 删除指定字符
    elif flag == 2:
        num = len('Python-')
        new_name = name[num:]
    # 打印新⽂件名,测试程序正确性
    print(new_name)
 
    # 重命名
    os.rename(dir_name+name, dir_name+new_name)
本文转载于网络 如有侵权请联系删除

相关文章

  • RabbitMQ竟然无法反序列化List

    前言  最近在接到了一个需求,大概是通过RabbitMq给xx子系统同步用户数据,要提供单个同步和批量同步。内心暗喜这不简单的很嘛。三下五除二就把代码给写完了,大概长这样:publicvoidsyncUserSingle(Useruser){ //省略一大堆业务代码 rabbitTemplate.convertAndSend("q_sync_user_single",user); } publicvoidsyncUserBatch(List<User>userList){ //省略一大堆业务代码 rabbitTemplate.convertAndSend("q_sync_user_batch",userList); } 复制  但是在联调的过程中,遇到了一个比较奇葩的问题。单个用户进行同步时,子系统可以正常消费。然后进行批量同步的时候,子系统报错了。并抛出java.lang.ClassCastException提示LinkedHashMapcannotxxxxclass。于是负责子系统的哥们笑嘻嘻的(表面笑嘻嘻)走过来对我说,不是约

  • Prometheus时序数据库-数据的查询

    前言在之前的博客里,笔者详细阐述了Prometheus数据的插入过程。但我们最常见的打交道的是数据的查询。Prometheus提供了强大的Promql来满足我们千变万化的查询需求。在这篇文章里面,笔者就以一个简单的Promql为例,讲述下Prometheus查询的过程。Promql一个Promql表达式可以计算为下面四种类型:瞬时向量(InstantVector)-一组同样时间戳的时间序列(取自不同的时间序列,例如不同机器同一时间的CPUidle) 区间向量(Rangevector)-一组在一段时间范围内的时间序列 标量(Scalar)-一个浮点型的数据值 字符串(String)-一个简单的字符串复制我们还可以在Promql中使用svm/avg等集合表达式,不过只能用在瞬时向量(InstantVector)上面。为了阐述Prometheus的聚合计算以及篇幅原因,笔者在本篇文章只详细分析瞬时向量(InstantVector)的执行过程。瞬时向量(InstantVector)前面说到,瞬时向量是一组拥有同样时间戳的时间序列。但是实际过程中,我们对不同Endpoint采样的时间是不可能精确

  • Electron+Vue开发爬虫客户端2-自动下载网页文件

    创建项目尽量用图形化界面创建项目安装插件也方便vueui复制安装插件vue-cli-plugin-electron-builder 插件官网地址:https://nklayman.github.io/vue-cli-plugin-electron-builder/ChooseElectronVersion选择默认即可运行报错INFOLaunchingElectron… Failedtofetchextension,trying4moretimes Failedtofetchextension,trying3moretimes Failedtofetchextension,trying2moretimes Failedtofetchextension,trying1moretimes Failedtofetchextension,trying0moretimes VueDevtoolsfailedtoinstall:Error:net::ERR_CONNECTION_TIMED_OUT 这是因为Devtools的安装需要翻墙注释掉src/background.js中的以下代码就行了if(

  • 简谈FPGA研发设计相关规范(企业中初入职场很实用)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。今天和大侠聊一聊FPGA研发设计相关规范,养成良好的个人习惯,代码设计风格等,都有助于日后发展。有哪些设计规范,从文档到工程建立等,聊一聊也许你会学到很多东西,少走很多弯路哦。话不多说,上货。在团队项目开发中,为了使开发的高效性、一致性、正确性,团队应当要有一个规范的设计流程。按照规范来完成项目的设计开发工作,归类清晰明了的工程文件夹级别;项目应拥有良好风格和完整的文档,如设计思路与调试记录及器件选型等;代码书写高效,即统一的书写规范,文件头包含的信息完整,无论自己还是团队他人阅读便一目了然。一、文档命名:清晰的文档命名能够让我们思路非常的清晰,所以FPGA工程文件夹的目录要求层次鲜明,归类清晰。一个工程必须要有一个严整的框架结构,用来存放相关的文档、设计,不仅方便自己查看,也提高了项目的团队工作效率。 下面我们来举例说明:一级文件夹为工程名<project> 二级文件夹多个:用以存放源文件<

  • 使用 Delete By Query API 的方式删除ES索引中的数据

    一、前言|ES作为现今最流行的搜索存储库,我们需要定期去清理ES集群的数据以保证集群处在一个最佳负载状态,那么如何去删除这些数据呢,我们今天来介绍一种比较常见的通过DeleteByQuery的方式去删除索引中的数据。二、DeleteByQueryAPI介绍怎么理解这个API呢?实际是批量删除数据的意思功能:根据特定的查询条件对ES相关索引中某些特定的文档进行批量删除。POSTindex_name/_delete_by_query { "query":{//这些是自定义查询条件,根据查询条件去批量删除 "match":{//请求体跟SearchAPI是一样的 "message":"somemessage" } } }复制DeleteByQuery删除原理:Delete_by_query并不是真正意义上物理文档删除,而是只是版本变化并且对文档增加了删除标记。当我们再次搜索的时候,会搜索全部然后过滤掉有删除标记的文档。因此,该索引所占的空间并不会随着该API的操作磁盘空间会马上释放掉,只有等到下一次段合并的时候才

  • Linux服务器搭建nvidia-docker环境过程详解

    docker相当于一个容器,其可以根据你所需要的运行环境构建相应的运行环境,此时各个环境之间彼此隔离,就不会存在在需要跑一个新的代码的时候破坏原来跑的代码所需要的环境,各个环境之间彼此隔离开,好像一个个容器将其隔离开一样由于docker只针对在CPU上面跑的情况,对于需要在GPU上面运行的服务器,其提供了一个nvidia-dockersudoapt-getinstall-ynvidia-docker2 sudopkill-SIGHUPdocker 对于怎么在服务器子账户上面搭建nvidia-docker,在百度上个个地方讲的都不一样,因此,在谷歌上查阅了相关的文档之后,将在服务器子账户上搭建nvidia-docker的方法陈列如下简单的来说,要安装nvidia-docker总共的步骤分为三步:InstallNVIDIAdriver Installdocker Installnvidia-docker 安装显卡驱动对于我们的服务器甚至大多数服务器来说,这一步都是在装机的时候必备的,因此这一步我们直接忽略,具体问题可以百度安装docker docker有两种可用的版本:社区办(CE)和企业

  • 宗成庆:人类语言技术展望

    摘要 机器翻译伴随着世界上第一台计算机的诞生而出现,随后成为人工智能领域最具挑战性的研究课题之一。70多年来,以机器翻译、人机对话系统、文本自动分类、自动文摘和信息抽取等为代表性应用的人类语言技术所走过的曲折发展历程,从不同的侧面折射出人工智能领域的荣禄兴衰。本文在简要回顾人类语言技术发展历程的基础上,重点介绍当前该技术面临的主要挑战和研究现状,并对未来发展的趋势进行展望。 关键词自然语言处理;自然语言理解;计算语言学;人类语言技术 中国人工智能学会通讯2020年第10卷第1期特约专栏宗成庆 中国科学院自动化研究所研究员,CAAIFellow,国际计算语言学委员会(ICCL)委员,亚洲自然语言处理学会(AFNLP)主席。主要从事自然语言处理、机器翻译等研究。主持国家项目10余项,国家重点研发计划重点专项首席科学家,ACMTALLIP和《自动化学报》副主编。曾任国际一流学术会议ACL2015和COLING2020程序委员会主席,多次担任IJCAI和AAAI领域主席。曾获国家科技进步奖二等奖、钱伟长中文信息处理科学技术奖一等奖等。荣获北京市优秀教师、宝钢优秀教师和中科院优秀导师等荣誉。回顾

  • 【JS 口袋书】第 6 章:JS 中的闭包与模块

    作者:valentinogagliardi 译者:前端小智 来源:github为了保证的可读性,本文采用意译而非直译。全局变量使用容易引发bug,咱们经常教导尽量不要使用全局变量,尽管全局变量在某些情况下是有用的。例如,在浏览器中使用JS时,咱们可以访问全局window对象,window中有很多有用的方法,比如:window.alert('Helloworld');//Showsanalert window.setTimeout(callback,3000);//Delayexecution window.fetch(someUrl);//makeXHRrequests window.open();//Opensanewtab复制这些方法也像这样使用:alert('Helloworld');//Showsanalert setTimeout(callback,3000);//Delayexecution fetch(someUrl);//makeXHRrequests open();//Opensanewtab复制这是方便的。Redux是另一个“

  • 8-STM32物联网开发WIFI+GPRS基础篇(STM32+GPRS(AT指令)实现MQTT远程通信控制)

    https://www.cnblogs.com/yangfengwu/p/11482905.html上一节测试的是Wi-Fi这节测试 GPRS看名字就知道了,简单的说就是 单片机使用AT指令控制模块实现MQTT通信控制这节是 STM32+GPRS(AT指令)实现MQTT通信控制:一,下载STM32程序1,方式一,串口下载(其他下载方式在最后补充)①调整拨动开关位置→短接BOOT0和3.3V→复位STM32②打开下载软件,下载程序选择对应的串口去掉短接,复位下单片机①手机卡②天线③调整拨动开关,让STM32和GPRS通信打开手机APP下载APP(该APP购买到安全篇即可获取,只有学到微信小程序篇才能看得懂源码,涉及的知识点多一些)扫码下载注意:只有这样的时候说明MQTT通信正常 (刚刚才知道可以插入视频....)然后最后说一下程序首先看一下官方的文档自行查看整体代码和上一节一样,有几个地方说一下实际上是为了缩短发送指令的时间,只要判断接收到相应的数据了,就立刻发送下一条指令但是,为了保险起见,中间有500ms延时再者,主函数里面用了一个串口回调函数  如果想知道回调函数怎么写的,可以看这

  • MySQL的基础操作

    一DDL数据库定义语言二DML数据库操作语言三DCL数据库控制语言四常用操作

  • 人工智能“花”落何处

    作者|TomAustin(Gartner研究公司前副总裁兼院士级分析师) 你是否曾将应用了人工智能技术的“杀手级应用”投入大规模生产中?实际上,这种情况较为少见。去年,全世界3182名首席信息官(CIO)中,仅有4%表示他们已将人工智能相关的应用投入生产中,或是在未来12个月内有此计划。首席信息官不一定了解企业中正在进行的每一个项目,但基本上这个数字的误差不会超过它的两倍。也许,8%的企业都已将这样的应用投入生产中,但8%这个数字很可能是对实际情况的一种高估。为什么会出现这种情况?今年6月27日,Gartner发布了一项人工智能技术成熟程度的研究,为企业架构师和科技创新者提供相关见解。该研究的重点在于人工智能技术的成熟程度,而不在于人工智能领域企业的发展状况。从表面上看,人工智能领域在过去十年中取得了突破性的进展。不断有新的、宝贵的机会涌现出来。在这十年中,在与人工智能有关的研究、会议、研究生项目、初创公司、风险资金、公司中的并购(M&A)活动、人工智能相关的工作发布、专利申请上,我们都取得了很大的进步。但我们看到的只是其中的一部分,还须考虑的是:如今,伟大的研究发现过多地涌现

  • ScalaPB(3): gRPC streaming

     接着上期讨论的gRPCunary服务我们跟着介绍gRPCstreaming,包括:Server-Streaming,Client-Streaming及Bidirectional-Streaming。我们首先在.proto文件里用IDL描述Server-Streaming服务:/* *respondingstreamofincrementresults */ serviceSumOneToMany{ rpcAddOneToMany(SumRequest)returns(streamSumResponse){} } messageSumRequest{ int32toAdd=1; } messageSumResponse{ int32currentResult=1; }复制SumOneToMany服务中AddOneToMany函数接受一个SumRequest然后返回streamSumResponse,就这么简单。经过编译后产生了SumOneToManyGrpc.scala文件,在这个文件里提供了有关RPC操作的api。我们看看protoc把IDL描述的服务函数变成了什么样的scala

  • 云的Next Big Thing,谷歌开始支持Docker的竞争对手

    【编者按】CoreOS创始人兼首席执行官AlexPolvi认为Docker的发展已经背弃了提供“一个标准的容器架构”的初衷,于是CoreOS才决定开始推出自己的标准化产品Rocket,并提供一个纯粹的容器标准,现在Rocket技术得到谷歌、RedHat以及VMware等一批大公司的支持。以下是原文:去年12月,Docker最早的支持者之一硅谷初创公司CoreOS公布了一个开源项目Rocket。CoreOS创始人兼首席执行官AlexPolvi觉得Docker已经偏离了最初的使命,现在,他和他的同事们希望利用Rocket来完成最初的使命。5个月后,谷歌经过慎重考虑正式加盟Rocket的开源项目,并且集成该项技术到它的一个云计算工具。Polvi将于今天早上在旧金山宣布谷歌参与这件事的正式结果,在给《WIRED》的电子邮件里,谷歌已确认了这个消息。具有讽刺意味的是,Docker是建立在支持谷歌庞大在线帝国软件之上的。基本上,Docker是一种更有效构建和操作运行GoogleSearch、GoogleMaps、Gmail的方式。你可以把它看作一个软件集装箱工具,允许开发人员整洁的打包他们的代码并

  • 使用VBA创建Access数据库

    导读:要处理数据量较大的数据,那么Excel会略显力不从心。特别是数据量大,且使用了Vlookup或大量的数组公式的工作簿,其效率可想而知。从这方面讲,Excel更适合数据的展示,Access更适合于数据的存储,当然如果数据量超过4GB,那么你可能要选择SQLSERVER或其他大型数据库。针对小微型企业,一般情况下Access已经足够。下面,介绍如何创建Access数据库,后续会介绍如何在Access数据库中建表,以及如何使用SQL语言管理数据库及查询数据,并将结果展示在Excel工作表中。操作演示:下面的演示中,你将看到,运行代码后,将自动创建一个名为基础台账.accdb的数据库,该数据库是一个空数据库。代码截图:附件及源码下载:此文已同步至【知嗒】知识号【Excel精英之家】,相关附件可下载安装【知嗒】app应用,注册一个账号,搜索并关注【Excel精英之家】,加群【Excel精英之家】下载。说明:【知嗒】知识号【Excel精英之家】受限较少,一天可以推送多篇文章,从文章数量看,要比微信公众号多一些,喜欢的朋友,可留意【知嗒】知识号【Excel精英之家】。如需反馈,或有更好的解决方

  • 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信

     前言:随着工业化的发展,目前越来越多的开发,从互联网走向传统行业。其中,工业领域也是其中之一,包括各大厂也都在陆陆续续加入工业4.0的进程当中。 工业领域,最核心的基础设施,应该是与下位硬件设备或程序进行通信有关的了,而下位机市场基本上是PLC的天下。而PLC产品就像编程语言一样,类型繁多,协议也多种多样。例如,西门子PLC最常用的S7协议、施耐德PLC最常用的Modbus协议、以及标准工业通信协议CIP协议等等。而多种通信协议里面,基于以太网通信的居多。以太网通信的里面,通用协议除了CIP协议,就属于ModbusTCP协议了。 接下来的内容,我会以从头开发一个简单的基于modbustcp通信的案例,来实现一个基础的通信功能。   有关环境: 开发环境:VS2022企业版 运行环境:Win10专业版 .NET环境版本:.NET6   【备注】源码在文末    1、新建一个基于.NET6带控制器的webapi项目,以及一个类库项目。如下图所示,新建以后的项目目录结构。     2、由于modbustcp通信实际上就是

  • 消防水系泵验收时应满足哪些要求

    4.(1)工作泵、备用泵、吸水管、出水管及出水管上的阀门、仪表的规格、型号、数量,应符合设计要求;吸水管、出水管上的控制阀应锁定在常开位置,并有明显标记。     (2)消防水泵应采用自灌式引水或其他可靠的引水措施。     (3)分别开启系统中的每一个末端试水装置和试水阀,水流指示器、压力开关等信号装置的功能均应符合设计要求。湿式自动喷水灭火系统的最不利点做末端放水试验时,自放水开始至水泵启动时间不应超过5min。     (4)打开消防水泵出水管.上试水阀,当采用主电源启动消防水泵时,消防水泵应启动正常;关掉主电源,主、备电源应能正常切换。备用电源切换时,消防水泵应在1min或2min内投入正常运行。自动或手动启动消防泵时应在555内物入企常运行。     (5)消防水泵停泵时,水锤消除设施后的用友不应超过水泵出口额定压力的1.3~1.5倍。     (6)对消防气压给水设备,当系统气压下降到设计最低压力时,通过压力变化信号应能启动稳压泵。     (7)消防水泵启动控制应置于自动启动挡,消防水泵应互为备用

  • $ 一步一步学Matlab(3)——Matlab中的数据类型

    小学时候我们就知道,数学中有自然数、整数、分数、小数等等很多种类型的数。到了中学,我们又发现了其实还有无理数、复数这些有些特殊的数。到了大学学了高等数学之后,我们又知道了其实还存在着无穷大、无穷小这样“不可思议”的“数”。 为了对各种数据类型都能够做到有效处理,Matlab中也规定了一系列不同的数据类型,下面对其进行一一介绍。 数值类型 数值类型其实就对应于数学中的各种类型的数,包括下面几种: 整数 浮点数(包括单精度和双精度) 复数 无穷量 非数值量 逻辑类型 现实世界中很多事情都是真假之间,比如真假美猴王,真钱假钱,真相与假象...Matlab世界也存在着这种用于判断真假的数据类型,通常0表示假(0表示无,什么都没有,四大皆空,当然是假),而非0的数表示真。 在数学中,我们也经常会遇到判断真假的问题,比如判断1>2这个式子是否成立。Matlab中提供了一系列的关系运算符: 关系运算符 含义 < 小于 <= 小于或等于 |大于 >=|大于或等于 ==|等于 ~=|不等于 下面将用一段Matlab代码来展现这些关系运算符的用法:

  • egg 配置微信公众号

    egg框架很强大,上周末突发奇想,用来作为微信公众号后台怎么样?想到就开干。 首先,要开发必须要先配置好才行,这里先讲一下怎么配。 首先你要有一个公众号,去申请,或者弄一个测试的公众号,地址 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421137522 搞到公众号后,就可以配置公众号基本设置了,   然后大概的步骤可以参照微信官方的文档进行,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 在egg的具体代码 1//config/config.default.js 2'usestrict'; 3 4module.exports=appInfo=>{ 5constconfig=exports={}; 6 7//useforcookiesignkey,shouldchangetoyourownandkeepsecurity 8config.keys=appInfo.name+'_151100

  • Shadertoy 教程 Part 6 - 使用光线步进算法创建3D场景

    Note:ThisseriesblogwastranslatedfromNathanVaughn'sShadersLanguageTutorialandhasbeenauthorizedbytheauthor.Ifreprintedorreposted,pleasebesuretomarktheoriginallinkanddescriptioninthekeypositionofthearticleafterobtainingtheauthor’sconsentaswellasthetranslator's.Ifthearticleishelpfultoyou,clickthisDonationlinktobuytheauthoracupofcoffee. 说明:该系列博文翻译自NathanVaughn的着色器语言教程。文章已经获得作者翻译授权,如有转载请务必在取得作者和译者同意之后在文章的重点位置标明原文链接以及说明。如果你觉得文章对你有帮助,点击此打赏链接请作者喝一杯咖啡。 朋友们,你们好!终于到了我们期待已久的时刻啦!在本篇教程中,你将首次学习到如何使用光线步进(Rayma

  • git取别名配置

    已经配置的别名 $gitconfig--globalalias.ststatus $gitconfig--globalalias.cocheckout $gitconfig--globalalias.cicommit $gitconfig--globalalias.brbranch $gitconfig--globalalias.lg"log--color--graph--pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(boldblue)<%an>%Creset'--abbrev-commit"复制   gitconfig部分文本 [alias] st=status co=checkout ci=commit br=branch lga=log--graph--decorate--oneline--simplify-by-decoration--all lg=log--color--graph--pretty=format:'%Cred%h%Creset-%C(yellow)

  • adbi学习:so hook实现机制

       本篇我们来看看adbi的实现原理,其实里面的知识点前面差不多都有涉及了,没多少新知识。adbi利用hijack程序将libexample.so注入到指定的进程中,并且在进程中加载libexample.so;而libexample.so在加载过程中会执行其.init_arraysection里的代码,代码中实现函数hook(替换原先的函数为自定义函数)。这样运行hijack就自动实现了函数hook。     hijack流程图:     1.得到pid进程下的mprotect()函数地址     2.得到piid进程下的dlopen()函数地址     3.利用ptraceattachpid进程,并得到regs并保存     4.将sc结构体push进pin进程的栈空间中;sc包含特定指令、regs、mprotect、dlopen和libexample.so的绝对路径     5.修改regs值并设置到pin进程,接着PTRACE_DETACH释放pid进程,使之得以继续运行;此时hijack已全部执行完毕     6.此时pid进程会去执行

相关推荐

推荐阅读