python操作json字符串,超详细的Python文件操作知识

3e20252ae64a3aee2531bafabca7e1bb.png

来自:CSDN,作者:南枝向暖北枝寒MA

链接:https://blog.csdn.net/mall_lucy/article/details/104547365

【导语】:python进行文件操作,在日常编程中是很常用的。为了方便大家,这里对各种文件操作的知识进行汇总。一文在手,无须它求!来一起学习吧。

本文分七个模块为大家详细介绍python中文件操纵相关知识,闲话少说,让我们开始!

一、文件的打开和关闭

open()函数f1 = open(r'd:\测试文件.txt', mode='r', encoding='utf-8')content = f1.read()print(content)f1.close()

with open(r'd:\测试文件.txt', mode='r', encoding='utf-8') as f1:content = f1.read()print(content)

open()内置函数,open底层调用的是操作系统的接口。

f1变量,又叫文件句柄,通常文件句柄命名有f1,fh,file_handler,f_h,对文件进行的任何操作,都得通过文件句柄.方法的形式。

encoding:可以不写。不写参数,默认的编码本是操作系统默认的编码本。windows默认gbk,linux默认utf-8,mac默认utf-8。

mode:可以不写。默认mode='r'。

f1.close()关闭文件句柄。

另外使用with open()的好处:

#优点1:不用手动关闭文件句柄。with open('文件操作的读', encoding='utf-8') as f1:print(f1.read())#优点2:一个语句可以操作多个文件句柄。with open('文件操作的读', encoding='utf-8') as f1, \open('文件操作的写', encoding='utf-8', mode='w') as f2:print(f1.read())f2.write('hahaha')

绝对路径和相对路径1.绝对路径:指的是绝对位置,完整地描述了目标的所在地,所有目录层级关系是一目了然的。比如C:/Users/Python37/python.exe

2.相对路径:是从当前文件所在的文件夹开始的路径。2.1 test.txt:是在当前文件夹查找 test.txt 文件。

2.2 ./test.txt:也是在当前文件夹里查找test.txt文件, ./ 表示的是当前文件夹,可以省略。

2.3 ../test.txt:从当前文件夹的上一级文件夹里查找 test.txt 文件。../ 表示的是上一级文件夹。

2.4 demo/test.txt,在当前文件夹里查找demo这个文件夹,并在这个文件夹里查找 test.txt文件。

3.路径书写的三种方法

3.1:\\

file = open('C:\\Users\\Python基础\\xxx.txt')

3.2: r'\'

file = open(r'C:\Users\Python基础\xxx.txt')

3.3 :'/'(推荐)

file = open('C:/Users/Python基础/xxx.txt')常用文件的访问模式1.打开文件的模式有(默认为文本模式):

r 只读模式【默认模式,文件必须存在,不存在则抛出异常】w 只写模式【不可读;不存在则创建;存在则清空内容在写入】a 只追加写模式【不可读;不存在则创建;存在则只追加内容】

2.对于非文本文件,我们只能使用b模式。注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。

rb 以二进制读取wb 以二进制写入ab 以二进制追加3.‘+’模式(就是增加了一个功能)

r+b 读写【可读,可写】w+b 写读【可写,可读】a+b 写读【可写,可读】

4.以bytes类型操作的读写,写读,写读模式

r+b 读写【可读,可写】w+b 写读【可写,可读】a+b 写读【可写,可读】

5.关于r+模式:打开一个文件用于读写,文件指针默认将会放在文件的开头。注意:如果在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会将原内容覆盖掉,直到覆盖到你写完的内容,然后再从后面开始读取。

文件'其他模式'中的内容是:王副班最帅#1. 先读后写f1 = open('其他模式', encoding='utf-8', mode='r+')content = f1.read()print(content)f1.write('Python开发者')f1.close()#2. 先写后读(错误实例)f1 = open('其他模式', encoding='utf-8', mode='r+')f1.write('Python开发者')content = f1.read()print(content) # 最帅f1.close()二、文件的读取和写入

1.读取

代码中用到的文件文件操作的读.txt 文件内容如下:

lucy最帅lucy很励志abcdef哈哈哈

read()全部读取出来:用rb模式打开,不用写encoding

f1 = open('文件操作的读', encoding='utf-8')content = f1.read()print(content, type(content))f1.close()f1 = open(r'C:\Users\lenovo\Desktop\编码进阶.png', mode='rb')content = f1.read()print(content)f1.close()

read(n)按照字符读取(r模式),按照字节读取(rb模式)。

f1 = open('文件操作的读', encoding='utf-8')content = f1.read(6)print(content) # lucy最帅f1.close()

readline()读取一行。

f1 = open('文件操作的读', encoding='utf-8')print(f1.readline().strip()) # lucy最帅print(f1.readline()) # lucy很励志\nf1.close()

readlines()返回一个列表,列表中的每个元素是原文件的每一行。如果文件很大,占内存,容易崩盘。

f1 = open('文件操作的读', encoding='utf-8')li = f1.readlines()print(li) # ['lucy最帅\n', 'lucy很励志\n', 'abcdef\n', '哈哈哈']f1.close()

for循环读取。文件句柄是一个迭代器。特点是每次循环只在内存中占一行的数据,非常节省内存。

f1 = open('文件操作的读', encoding='utf-8')for line in f1:print(line.strip())f1.close()

2.写入

w模式

没有文件,则创建文件,写入内容;如果文件存在,先清空原文件内容,再写入新内容。

f1 = open('文件操作的写', encoding='utf-8', mode='w')f1.write('lucy真帅')f1.close()

wb模式f1 = open(r'C:\Users\lenovo\Desktop\编码进阶.png', mode='rb')content = f1.read()f1.close()f2 = open('图片.jpg', mode='wb')f2.write(content)f2.close()

关于清空

关闭文件句柄,再次以w模式打开此文件时,才会清空。

3.指针定位

tell()方法用来显示当前指针的位置

f = open('test.txt')print(f.read(10)) # read 指定读取的字节数print(f.tell()) # tell()方法显示当前文件指针所在的文字f.close()

seek(offset,whence)方法用来重新设定指针的位置。

offset:表示偏移量

whence:只能传入012中的一个数字。

0表示从文件头开始

1表示从当前位置开始

2 表示从文件的末尾开始f = open('test.txt','rb') # 需要指定打开模式为rb,只读二进制模式print(f.read(3))print(f.tell())f.seek(2,0) # 从文件的开头开始,跳过两个字节print(f.read())f.seek(1,1) # 从当前位置开始,跳过一个字节print(f.read())f.seek(-4,2) # 从文件末尾开始,往前跳过四个字节print(f.read())f.close()

三、实现文件拷贝功能

import osfile_name = input('请输入一个文件路径:')if os.path.isfile(file_name):old_file = open(file_name, 'rb') # 以二进制的形式读取文件names = os.path.splitext(file_name)new_file_name = names[0] + '.bak' + names[1]new_file = open(new_file_name, 'wb') # 以二进制的形式写入文件while True:content = old_file.read(1024) # 读取出来的内容是二进制new_file.write(content)if not content:breaknew_file.close()old_file.close()else:print('您输入的文件不存在')

四、CSV文件的读写

CSV文件

CSV文件:Comma-Separated Values,中文叫逗号分隔值或者字符分割值,其文件**以纯文本的形式存储表格数据。**可以把它理解为一个表格,只不过这个表格是以纯文本的形式显示的,单元格与单元格之间,默认使用逗号进行分隔;每行数据之间,使用换行进行分隔。

name,age,scorezhangsan,18,98lisi,20,99wangwu,17,90jerry,19,95

Python中的csv模块,提供了相应的函数,可以让我们很方便的读写csv文件。

CSV文件的写入import csv# 以写入方式打开一个csv文件file = open('test.csv','w')# 调用writer方法,传入csv文件对象,得到的结果是一个CSVWriter对象writer = csv.writer(file)# 调用CSVWriter对象的writerow方法,一行行的写入数据writer.writerow(['name', 'age', 'score'])# 还可以调用writerows方法,一次性写入多行数据writer.writerows([['zhangsan', '18', '98'],['lisi', '20', '99'], ['wangwu', '17', '90'], ['jerry', '19', '95']])file.close()CSV文件的读取

import csv# 以读取方式打开一个csv文件file = open('test.csv', 'r')# 调用csv模块的reader方法,得到的结果是一个可迭代对象reader = csv.reader(file)# 对结果进行遍历,获取到结果里的每一行数据for row in reader:print(row)file.close()

五、将数据写入内存

除了将数据写入到一个文件以外,我们还可以使用代码,将数据暂时写入到内存里,可以理解为数据缓冲区。Python中提供了StringIO和BytesIO这两个类将字符串数据和二进制数据写入到内存里。

StringIO

StringIO可以将字符串写入到内存中,像操作文件一下操作字符串。

from io import StringIO# 创建一个StringIO对象f = StringIO()# 可以像操作文件一下,将字符串写入到内存中f.write('hello\r\n')f.write('good')# 使用文件的 readline和readlines方法,无法读取到数据# print(f.readline())# print(f.readlines())# 需要调用getvalue()方法才能获取到写入到内存中的数据print(f.getvalue())f.close()

BytesIO

如果想要以二进制的形式写入数据,可以使用BytesIO类,它的用法和StringIO相似,只不过在调用write方法写入时,需要传入二进制数据。

from io import BytesIOf = BytesIO()f.write('你好\r\n'.encode('utf-8'))f.write('中国'.encode('utf-8'))print(f.getvalue())f.close()

六、sys模块的使用

sys.stdin接收用户的输入,就是读取键盘里输入的数据,默认是控制台。input方法就是读取sys.stdin里的数据。

import syss_in = sys.stdinwhile True:content = s_in.readline().rstrip('\n')if content == '':breakprint(content)

sys.stdout标准输出,默认是控制台

import sysm = open('stdout.txt', 'w', encoding='utf8')sys.stdout = mprint('hello')print('yes')print('good')m.close()

运行结果:生成一个stdout.txt文件,文件内容如下:

helloyesgood

sys.stderr错误输出,默认是控制台

import sysx = open('stderr.txt', 'w', encoding='utf8')sys.stderr = xprint(1 / 0)x.close()

运行结果:生成一个stderr.txt文件,文件内容如下:

Traceback (most recent call last):File "E:/python基础/demo.py", line 4, inprint(1 / 0)ZeroDivisionError: division by zero

七、序列化和反序列化

通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(例如列表、字典、元组等),就无法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。

序列化:将数据从内存持久化保存到硬盘的过程。

反序列化:将数据从硬盘加载到内存的过程。

python 里存入数据只支持存入字符串和二进制。

json:将Python里的数据(str/list/tuple/dict)等转换成为对应的json。

pickle:将Python里任意的对象转换成为二进制。

Python中提供了JSON和pickle两个模块用来实现数据的序列化和反序列化。

JSON模块

JSON(JavaScriptObjectNotation, JS对象简谱)是一种轻量级的数据交换格式,它基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON的本质是字符串,区别在于json里要是用双引号表示字符串。

使用JSON实现序列化dumps方法的作用是把对象转换成为字符串,它本身不具备将数据写入到文件的功能。import jsonfile = open('names.txt', 'w')names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']# file.write(names) 出错,不能直接将列表写入到文件里# 可以调用 json的dumps方法,传入一个对象参数result = json.dumps(names)# dumps 方法得到的结果是一个字符串print(type(result)) ## 可以将字符串写入到文件里file.write(result)file.close()dump方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里。import jsonfile = open('names.txt', 'w')names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']# dump方法可以接收一个文件参数,在将对象转换成为字符串的同时写入到文件里json.dump(names, file)file.close()使用JSON实现反序列化

loads方法需要一个字符串参数,用来将一个字符串加载成为Python对象。import json# 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象result = json.loads('["zhangsan", "lisi", "wangwu", "jerry", "henry", "merry", "chris"]')print(type(result)) #load方法可以传入一个文件对象,用来将一个文件对象里的数据加载成为Python对象。

import json# 以可读方式打开一个文件file = open('names.txt', 'r')# 调用load方法,将文件里的内容加载成为一个Python对象result = json.load(file)print(result)file.close()

pickle模块

和json模块类似,pickle模块也有dump和dumps方法可以对数据进行序列化,同时也有load和loads方法进行反序列化。区别在于,json模块是将对象转换成为字符串,而pickle模块是将对象转换成为二进制。

pickle模块里方法的使用和json里方法的使用大致相同,需要注意的是,pickle是将对象转换成为二进制,所以,如果想要把内容写入到文件里,这个文件必须要以二进制的形式打开。

使用pickle模块实现序列化

dumps方法将Python数据转换成为二进制import picklenames = ['张三', '李四', '杰克', '亨利']b_names = pickle.dumps(names)# print(b_names)file = open('names.txt', 'wb')file.write(b_names) # 写入的是二进制,不是存文本file.close()dump方法将Python数据转换成为二进制,同时保存到指定文件import picklenames = ['张三', '李四', '杰克', '亨利']file2 = open('names.txt', 'wb')pickle.dump(names, file2)file2.close()

使用pickle模块实现反序列号loads方法,将二进制加载成为Python数据import picklefile1 = open('names.txt', 'rb')x = file1.read()y = pickle.loads(x)print(y)file1.close()load方法,读取文件,并将文件的二进制内容加载成为Python数据import picklefile3 = open('names.txt', 'rb')z = pickle.load(file3)print(z)

JSON与pickle区别

json模块:

将对象转换成为字符串,不管是在哪种操作系统,哪种编程语言里,字符串都是可识别的。

json就是用来在不同平台间传递数据的。

并不是所有的对象都可以直接转换成为一个字符串,下表列出了Python对象与json字符串的对应关系。Python JSON dict object list,tuple array str string int,float number True true False false None null如果是一个自定义对象,默认无法转换成为json字符串,需要手动指定JSONEncoder。

如果是将一个json串重新转换成为对象,这个对象里的方法就无法使用了。import jsonclass MyEncode(json.JSONEncoder):def default(self, o):# return {"name":o.name,"age":o.age}return o.__dict__class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(self.name+'正在吃东西')p1 = Person('zhangsan', 18)# 自定义对象想要转换成为json字符串,需要给这个自定义对象指定JSONEncoderresult = json.dumps(p1, cls=MyEncode)print(result) # {"name": "zhangsan", "age": 18}# 调用loads方法将对象加载成为一个对象以后,得到的结果是一个字典p = json.loads(result)print(type(p))pickle模块:

pickle序列化是将对象按照一定的规则转换成为二进制保存,它不能跨平台传递数据。

pickle的序列化会将对象的所有数据都保存。

看到这还没来得及跑的同学,给个三连好吗?

0983127ccab15cab9c806026d1e1473f.png

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

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

相关文章

php头尾分离,laravel怎么做模板的头尾分离

关注博主,每天分享项目实战经验1.首先找到页面的公共部分,放在layouts这个目录下的home.blade.php2.设置内容区域yield(content)3.在其他页面使用模板引擎,先继承,然后在使用section即可extends(layouts.home)section(content)I a…

oracle11g备份出错,Oracle 11g备份导入12c错误

Oracle 11g备份导入12c错误Oracle11g:用户名:FJCPP 表空间:FYSOFT_DATA01 临时表空间:FYSOFT_DATA01导入:expdp FJCPP/FJCPP DIRECTORYdump_dir DUMPFILEFJCPP_20190717_1517_137.dmp logfileFJCPP_20190717_1517_137.…

matlab数字图像处理课程设计报告,数字图像处理课程设计实验报告.doc

数字图像处理课程设计实验报告数字图像处理课程设计题 目:数字图像处理及Huufman(或小波变换)编码仿真实现学生姓名:学 院:信息工程学院系 别:电子信息工程系专 业:电子信息工程班 级:电子指导教师&#xf…

oracle大于条件,oracle中sql语句中的in的条件数量大于1000有问题

oracle中sql语句中的in的条件数量大于1000有问题oracle中sql语句中select * from t_Test t where t.Id in(1,2,3......)/*数量不能大于1000个*/解决方法 分割成多次in 然后再或上 如 select * from t_Test t where t.Id in(1,2,3......800) or t.Id in(801,802,803......13…

oracle ora-16003,ORA-31600错误分析

作者:guoge[more]今天在对9i数据库做export时,出现如下错误:E:>exp system/manager filebackbill.dmp ownerbackbillExport: Release 9.2.0.4.0 - Production on Thu Nov 18 14:42:11 2004Copyright (c) 1982, 2002, Oracle Corporation. All rights…

探寻FPGA技术的广泛应用与未来前景

目录 1. FPGA的基础 2. FPGA的工作原理 3. FPGA的优势 3.1 灵活性 3.2 快速开发周期 3.3 高性能 4. FPGA的应用领域 4.1 通信系统 4.2 图像处理 4.3 嵌入式系统 4.4 科学研究 5. FPGA的未来展望 1. FPGA的基础 FPGA,即现场可编程门阵列(Fiel…

oracle元数据到ods,将元数据存储到Jackrabbit存储库中

小编典典对于JCR 2.0,上传文件基本上与对于JCR 1.0而言是相同的。但是,JCR 2.0添加了一些有用的附加内置属性定义。“ nt:file”节点类型旨在表示文件,并且在JCR 2.0中具有两个内置属性定义(这两个属性定义都是在创建节点时由存储…

linux 负载命令,通过Linux命令查看系统平均负载的方法

1、Linux系统的平均负载的概念有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待。特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网…

linux 进程调度源码分析,Linux调度器源码分析

代码分析根据3.10版本通过对前面的学习我们知道Linux的调度分为两种周期调度 完成周期性算法参数的更新和系统其它实际的检查主调的 真正的调度过程我们现在来看下主调的的代码框架。入口根《调度发生的情况》的学习,我们知道所有的调度最后都会到 schedule 函数中。…

linux修改端口cost值,Linux下通过修改网卡驱动的参数调整Intel网卡的性能

下面列出paramerter中和性能相关的几个以及他们的取值范围和默认值。InterruptThrottleRate范围:100-100000 (0off, 1dynamic)默认:0注:不支持82542, 82543, 82545, 82544芯片RxDescriptors范围:80-256 for 82542 and 82543-based…

Linux跑齿轮命令,【转】glxgears命令

glxgears是一个测试你的Linux是否可以顺利运行2D、3D的测试软件。这个程序弹出一个窗口,里面有三个转动的齿轮,屏幕将显示出每五秒钟转动多少栅,所以这是一个合理的性能测试。窗户是可以缩放的,栅数多少极大程度上依赖于窗口的大小…

log4j日志 linux配置,Log4j 日志详细用法

简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地、日志信息的输出格式Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离Java ide环…

linux 改目录前缀,Linux修改终端显示前缀及环境变量

Linux终端前面默认显示一长串,如:这是由PS1环境变量决定的:[[email protected] dir]$ echo $PS1[\u\H \W]\$其中\u代表用户,\H代表主机,\W代表目录可以修改环境变量,有三种方法:1. 直接修改&…

linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...

Preface新版本的QT creatorV4.0.0之后,就QT creator结构本身就发生了很大的变化,许多文件路径以及结构都发生了较大的变化。因此,fcitx的qt5库位置也发生了变化,但是原理还是一样的,都是需要一个动态依赖库&#xff1a…

lisp 读取dwg 统计信息_预制梁厂 BIM 技术和自动化、信息化应用方案

一、使用 Planbar 桥梁模块进行 BIM 模型创建Planbar是德国内梅切克软件工程有限公司专门针对混凝土图纸构件的软件产品,通过三十多年专注于预制构件设计工作所累积的经验,PLANBAR 实现了无与伦比的规划深度。PLANBAR 支持 40 种以上的数据交换形式&…

windows os x linux比较,对比测试:Ubuntu 11.04 vs Win7 vs OS X 10.7

今天我们带来了关于Ubuntu 11.04,Windows 7,Mac OS X 10.7的对比测试,包括图片编辑、视频编码、多任务测试等。本次测试是在同一机子上展开的,这样避免了硬件的因素影响。Ubuntu 11.04,Mac OS X 10.7硬件参数&#xff…

简述osi参考模型各层主要功能_OSI网络模型

OSI七层模型和TCP/IP五层模型 一、OSI参考模型 1、OSI的来源 OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有…

linux 线程优先级算法,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼图 1 RT-Linux结构RT -Linux的关键技术是通过软件来模拟硬件的中断控制器。当Linux系统要封锁CPU的中断时时,RT-Linux中的实时子系统会截取到这个请求,把它记录下来,而实际上并不真正封锁硬件中断…

python linux log,linux,python 常用的处理log的命令

一般的log文件都是需要过滤ps:管道符| 管道符前面的输出值grep 过滤查找将是error的log过滤显示grep 221.2.100.138 web.access.loggrep 221.2.100.138 web.access.logless web.access.log |grep "221.2.100.138"统计error行数grep 221.2.100.138 web.access.log |…