版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章
文件Python程序设计本章要点CSV文件文件的打开与关闭文件的读写操作JSON文件文件与文件夹操作DeepSeek的使用学习目标了解文件的基本类型及CSV、JSON格式的特点;理解文件打开、读写与关闭的完整操作流程及资源管理的重要性;掌握文本文件、CSV和JSON文件的读写方法;熟悉文件与文件夹的重命名、删除等基本操作,培养数据安全意识和规范操作习惯。引言文件是指为了重复使用或长期使用的目的,以文本或二进制形式存放于外部存储器(硬盘、U盘、光盘等)中的数据。文件是信息交换的重要途径,也是利用程序解决实际问题的重要媒介。程序可以随时读取文件里的全部或部分数据,数据的处理结果写入文件后,可以长期保存,供其他应用读取和处理。文件的使用,可以消除计算机内存对数据体积的限制,也可以处理远超过内存大小的数据量。1文件的打开与关闭文件的基本知识按照数据组织形式(逻辑层面)不同,文件分为文本文件和二进制文件两类。文本文件内部存储的是常规的中西文字符、数字、标点等符号,换行常用符号'\n'表示,此类文件一般可以使用普通文本编辑工具打开和编辑,可以直接阅读和理解文件内容。Python3.x默认使用
UTF-8
编码格式。二进制文件中的数据以二进制的形式存储,读取此类文件需要能够解析二进制数据的结构和含义的应用软件。文件的基本知识不论是文本文件还是二进制文件,读写操作一般分为以下三步:①打开文件并生成文件对象;
②借助文件对象对文件内容进行读取或写入等操作;
③保存文件内容、关闭文件对象。文件的打开函数open():该函数可以将文件以文本形式或二进制形式打开用于读或写操作,其基本语法为:open(file,mode='r',encoding=None)参数说明:file:是一个带路径的文件名,一个从根目录开始的绝对路径(如'c:\\temp\\temp.txt')以当前程序文件所在路径为参照位置的相对路径当打开的文件与当前程序文件在同一路径下时,不需要写路径。考虑到程序的可移植性,一般建议使用相对路径mode:是可选参数,用于指定文件打开的方式和类型,缺省时使用默认值'r',以只读方式打开。该参数可以使用的符号包括'r'、'w'、'x'、'a'、'b'、't'、'+'等符号文件的打开函数open():该函数可以将文件以文本形式或二进制形式打开用于读或写操作,其基本语法为:open(file,mode='r',encoding=None)参数说明:encoding:是可选参数,用于标明打开文本文件时,采用何种字符编码处理数据,encoding参数缺省时,表示使用当前操作系统默认编码类型(中文Windows10默认为GBK编码,Mac和Linux等一般默认编码为ASCII编码)。当使用二进制模式打开文件时,encoding参数不可使用。文件的打开
mode参数符号含义'r'以只读模式打开文件(默认值)'w'以写数据模式打开文件,该文件已存在,先清除该文件中所有内容;该文件不存在,先创建该文件再打开。'x'以创建文件写数据模式打开文件,该文件已存在,打开失败。'a'以追加写数据模式打开文件,该文件已存在,新数据追加在现有数据之后;该文件不存在,先创建文件后在打开。'b'以二进制模式打开文件处理数据't'以文本模式打开文件处理数据(默认模式)'+'打开文件并允许更新,相当于增加读或写模式(与'r'、'w'或'a'组合使用,如'r+'可读可写、'w+'可写可读、'a+'可追加写,可读)文件的打开
open()函数打开文本文件会返回一个可遍历的文件对象,可以使用循环来遍历文件的数据,每次循环获得文件的一行数据,行末会有一个换行符'\n'。文件的关闭打开的文件使用完毕,必须关闭文件对象以确保对文件中数据的所有改变都写回到文件中,同时释放文件的读写权限,使其他程序可以操作该文件。需要使用文件对象的close()方法关闭文件。语法格式如下:f.close()f.close()方法被执行时,会先将文件缓冲区中的数据写入文件,再关闭已打开的文件对象f。使用f.close()可以查看文件对象是否是关闭状态,如果文件对象f已关闭,f.close()的值为True,否则为False。文件的关闭Python还提供了一种内置类型,称为上下文管理器。上下文管理器定义了运行时上下文这一概念,用于设定某个对象的使用范围,一旦离开这个范围,将会有特殊的操作被执行。上下文管理器由Python关键字“with”和“as”联合启动,将文件打开操作通过关键字“with…as”的方式置于上下文管理器中,不需要再用f.close()显式的关闭文件,一旦离开隶属“with…as”的缩进代码范围,文件对象“f”的关闭操作会自动执行。文件操作时,可以使用这种方法以避免文件关闭错误。实例8.1读取文件有一个文本文件存储是孟浩然的春晓.txt,内容如下:春晓春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。编程读取文件的内容。实例8.1读取文件访问文件里的数据,必须先用open()函数打开文件,只读取文件,不修改,读取模式参数mode的值可设为‘r’。文件内容可用循环逐行输出,文件的每一行被当作一个字符串,每个行末有一个换行符“\n”,所以返回的第一行应该为:“春晓\n”,在print输出时,行末的换行符“\n”会被解析为一个换行,导致输出的每一行数据后有一个空行存在。可以用replace()函数去掉行末的换行符,使输出时不再有额外的空行。输出操作完成后要关闭文件。文件打开后得到的是一个文件对象,不要试图用print(f)输出文件内容,这个操作只能返回文件对象的信息。实例8.1读取文件#读取文件的内容f=open('春晓.txt','r',encoding='utf-8')#使用open函数以只读模式打开'春晓.txt'文件,返回文件对象f,编码为utf-8#参数'r'表示以只读,mode缺省表示文本模式打开文件,#encoding='utf-8'参数表示以'utf-8'编码方式处理数据#print(f)#<_io.TextIOWrappername='春晓.txt'mode='r'encoding='utf-8'>forlineinf:#对文件进行逐行遍历print(line.replace('\n',''))#replace()函数去掉行末的换行符,输出无空行#print(line.strip())#也可用strip()函数去掉行末的空白字符f.close()#关闭文件对象实例8.1读取文件#使用with和as关键字启动上下文管理器,缩进代码在上下文管理器内with
open('春晓.txt','r',encoding='utf-8')
as
f:forlineinf:#对文件进行逐行遍历print(line.strip())2文件的读写操作文件的读取方法文本文件和二进制文件的读写基本相同,其区别是文本文件的读写按照字符串方式,二进制文件的读写按照字节流的方式。为便于理解,本节以文本文件为例进行文件读写操作的讲解。Python文件对象提供了三个读取数据的方法:read()、readline()和readlines()。文件读取方法的描述如下表所示。每种方法可以接收一个参数以限制每次读取的数据量,但通常不使用参数。文件的读取方法方法描述read(size)无参数或参数为-1时,读取全部文件内容;当参数size为大于或等于0的整数时,读取size个字符readline(size)无参数或参数为-1时,读取并返回文件对象中的一行数据,包括行末结尾标记'\n'。当参数size为大于或等于0的整数时,最多返回当前行的前size个字符readlines(hint)无参数时,读取文件全部数据,返回一个列表,列表中每个元素是文件对象中的一行数据,包括行末的换行符’\n’。
当参数hint为大于0的整数时,读取hint行,当参数小于等于0整数时,读取整个文件的内容seek(offset,whence)改变当前文件读写作指针的位置;
offset为指针偏移量;whence代表参照物,有三个取值:0文件开始、1当前位置、2文件结尾tell()返回文件指针当前的位置文件的读取方法1.read()方法read()方法一次性读取整个文件,通常用于将文件内容放到一个字符串变量中,如果文件大于可用内存,可以反复调用read(size)方法,每次最多读取size个字节的内容。withopen('春晓.txt','r',encoding='utf-8')asf:txt=f.read()#一次读取文件中的全部数据#txt=f.read(2)读取前2个字符,输出:春晓print(txt) read(size)无参数或参数为-1时,读取全部文件内容;当参数size为大于或等于0的整数时,读取size个字符文件的读取方法2.readline()方法readline()方法每次只读取一行数据,文件指针移动到下一行开始;readline()方法通常比readlines()速度慢,仅当没有足够内存可以一次读取整个文件时,才使用readline()方法。3.readlines()方法readlines()方法一次读取文件中所有数据行,文件指针一次性就移动到文件结尾处。readlines()方法自动将文件内容转成一个列表,列表中每个元素是文件对象中的一行数据,该列表可以由for...in...结构进行处理。文件的读取方法withopen('春晓.txt','r',encoding='utf-8')asf:
txt=f.readline()#读取文件第一行,输出为:春晓print(txt)#输出为:春晓print(f.tell())#输出当前文件指针位置,输出8
txt=f.readlines()#读取指针之后的所有行print(txt)#输出['春眠不觉晓,处处闻啼鸟。\n','夜来风雨声,花落知多少。\n']print(f.tell())#当前文件指针位置为84,处于文件结尾,后面无数据,输出84
txt=f.readlines()#后面无数据,结果为空列表print(txt)#输出[]f.seek(0)#移动指针到文件起始位置
txt=f.readlines()#可读到文件中全部数据print(txt)#输出['春晓\n','春眠不觉晓,处处闻啼鸟。\n','夜来风雨声,花落知多少。\n']文件的读取方法用open()方法打开文件后,生成的文本文件对象本身就支持用for...in...结构进行遍历。直接对文件对象进行遍历,不需要将文件中的数据一次性读到内存中,可以读一行处理一行。当数据文件非常大时,用直接遍历文件对象的方法,既可以避免内存不足的问题,又可以提高处理速度。withopen('春晓.txt','r',encoding='utf-8')asf:forlineinf:#对文件进行逐行遍历print(line.replace('\n',''))文件的读取方法4.seek()方法Python在文件读取过程中使用了指针,在文件刚打开时,指针是指向文件内容的开端的,伴随着读写的进行指针一步一步往后移动。下一次读写从指针当前位置向后进行,当指针移动到文件结尾后,其后已经没有数据,再试图读取数据就没有返回值了。如果期望重新读取文件中的数据,可使用seek()将文件读取指针移动到期望的位置。操作文件指针的方法为:seek(offset,whence)文件的读取方法4.seek()方法操作指针的方法为:seek(offset,whence)参数说明:offset:代表文件指针的偏移量,单位是字节bytes,whence:代表偏移的参照物,有三个取值:whence=0表示文件开始(缺省值,文本和二进制文件都可用),要求偏移量≥0whence=1表示当前位置,偏移量可以为负值(负值仅适用于二进制文件)。whence=2表示文件结尾,偏移量可以为负值(负值仅适用于二进制文件)。当whence=1/2时,在二进制文件中可设定任意偏移量,在文本文件中,只允许偏移量为0。文件的读取方法5.tell()方法tell()方法可返回当前指针的位置。使用文件对象的tell()方法,可以获取当前文件指针的位置。使用seek(offset)可以移动文件读取指针到指定位置。不同编码格式字符所占字节数可能不同,西文一个字符占一个字节,但是中文应用不同编码时,一个字符可能占用2个、3个甚至4个字节,故使用offset很难预估文件指向希望移动到的精确位置。如果移动到一个汉字的非起始字节位置时,输出会产生乱码。在对文本文档使用seek()方法时,一般使用seek(0)将文件指针移动到文件开始位置。文件写入方法进行文件的写入操作,打开文件时,要将mode参数设置为'w'、'x'、'a'等字符或用“+”增加写权限,但要注意,使用“r+”模式时文件处于改写状态,新写入的数据会覆盖原文件起始位置相同数量字符的数据。Python文件对象提供了write()和writelines()两个写入数据的方法,可将指定的字符串和以字符串为元素的列表写入文件。方法描述write(b)将给定的字符串或字节流对象写入文件writelines(lines)将一个元素全为字符串的列表写入文件文件写入方法#三引号的字符串,可以保留格式s='''定风波·莫听穿林打叶声莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。'''#每行后的'\n'是换行符ls=['江雪\n','千山鸟飞绝,万径人踪灭。\n','孤舟蓑笠翁,独钓寒江雪。\n']withopen('春晓.txt','a+',encoding='utf-8')asf:
f.write(s)#将字符串s写入文件,附加到当前内容后面
f.writelines(ls)#将列表ls写入文件,附加到当前内容后面f.seek(0)#移动指针到文件起始位置forlineinf:#对文件进行逐行遍历print(line.replace('\n',''))3CSV文件CSV格式文件CSV(Comma-SeparatedValues,逗号分隔值)文件是一个字符序列,由任意数目的记录组成。一般要求每条记录都有同样的字段结构,文件开头不留空行,如果包含列名,则位于文件第一行。数据不跨行,无空行。以半角逗号(’,’)作分隔符,列为空也要表达其存在(即用作分隔符的逗号不能省略)。内码可为ASCII、Unicode或者其他编码。CSV是一种通用的、相对简单的文件格式,在商业、科学等领域广泛应用。CSV格式常被用于数据文件的输入/输出格式。CSV是文本文档,所以对文本进行读写的方法都适用于CSV格式文件的数据处理。而CSV格式文件里的数据基本上都是由行和列构成的二维数据,可以使用列表嵌套的方法对其进行处理。实例8.2统计成绩有一个存放学生课程成绩的文件“score.csv”,存有9名同学各3门课的成绩。请读取并显示文件内容,计算每位同学的总分附加到课程成绩后面,根据每名同学的总分进行排序,并将排序后的结果写入到新文件scoreSort.csv中。姓名,语文,数学,英语赵明,94,92,83梁武,59,49,58文征,62,45,46李悦,54,57,90张雪,49,75,61李欣,75,49,80林梦,64,76,61王莉,49,92,50刘星,68,84,61score.csv
内容如下实例8.2统计成绩打开文件后对文件进行遍历,读取每行的内容格式为:'赵明,94,92,83\n',用split(',')函数根据逗号分隔元素产生一个列表,形如:['赵明','94','92,'93'],将这个列表作为一个元素加到列表score中。这个操作实际上是将CSV文件数据视为一个二维列表,这个二维列表的每个元素都是列表,且每个子列表的元素个数相同。对文件中数据的操作就变成了对这个列表的操作,可以通过索引和切片的方式对其进行访问和处理。实例8.2统计成绩再将处理好的数据写回文件时,要注意文件的打开模式要有写权限,而且用write()写回数据时,原CSV文件中的分隔符(逗号)需要重新加进去。可以用join()函数,括号中以序列为参数,指定用逗号作为分隔符',',可以将序列中的各元素用逗号连接起来。行末的换行符也需要重新加入,以免所有数据写到一行中。换行符的添加可用字符串连接的方式,用“+”将“\n”与列表中的元素连接起来。具体方法是:','.join(title)+'\n'。实例8.2统计成绩#读取csv格式文件并进行数据统计分析score=[]#创建空列表,准备存放文件中的数据#打开文件,读取原文件内容并放入列表中withopen('score.csv','r',encoding='ansi')asdata:#以读模式打开文件forlineindata:#遍历文件对象line=line.strip()#替换掉行末的空白字符(此处换行符)score.append(line.split(','))#得到的列表作为一个元素增加到score中#line.split(',')会输出['赵明','94','92','83']#离开上下文管理器作用范围,文件对象被关闭title=score[0]#为便于理解,将标题行切片单独放在一个列表里score=score[1:]#存储去掉标题行的数据#计算总分scoreSum=[]forxinscore:scoreSum.append(x+[str(sum(map(int,x[1:])))])实例8.2统计成绩#处理后数据写回到文件withopen('scoreSort.csv','w',encoding='ansi')asdata:#以写模式打开文件data.write(','.join(title)+',总分'+'\n')#写标题行,行末加换行符scoreSum.sort(key=lambdasocreSum:eval(socreSum[4]),reverse=True)#按总分降序排序forsinscoreSum:data.write(','.join(s)+'\n')#写数据行,逗号分隔,行末加换行符print()#输出文件内容print('排序后文件内容:')withopen('scoreSort.csv','r',encoding='ansi')asdata:#只读模式打开文件forlineindata:print(line.strip())#输出文件全部内容实例8.2统计成绩#列表推导式方法:withopen('score.csv','r',encoding='ansi')asdata:#以读模式打开文件score=[line.strip().split(',')forlineindata]scoreSum=[x+[str(sum(map(int,x[1:])))]forxinscore[1:]]scoreSum.sort(key=lambdaline:eval(line[4]),reverse=True)scoreSum=[score[0]+['总分']]+scoreSumwithopen('scoreSort.csv','w',encoding='ansi')asdata:#以写模式打开文件[data.write(','.join(s)+'\n')forsinscoreSum]#写数据行,加换行符print('排序后文件内容:')#输出文件内容print('排序后文件内容:')withopen('scoreSort.csv','r',encoding='ansi')asdata:#只读模式打开文件forlineindata:print(line.strip())#输出文件全部内容第三方库的文件处理列表类型常用于数据处理,数据的存在形式主要有两种:文件形式和数据库形式。对于文本文件中的数据,可以采用遍历的方式轻松读取;而对于其他格式的数据文件或者存储在数据库中的数据,则能够借助Numpy库或Pandas库进行读取。Numpy库Numpy库将从文件中读取的数据以数组(array)形式组织,这极大地简化了数据的处理和分析过程。loadtxt()函数是Numpy库中用于读取文本文件数据的主要函数,它能够将文件中的数据转换成Numpy数组。loadtxt()读取数据时,可以自定义分隔符、数据类型等参数;还提供了跳过无效数据行、限制最大读取行数等实用功能,使得数据读取过程更加灵活和高效。Numpy库使用Numpy库之前需要先使用pip安装,Numpy的安装方式为:pipinstallnumpy(1)loadtxt()函数loadtxt()的目标是快速读取简单格式化的文件,要求文件每一行具有相同数量的数据。它的语法结构如下。numpy.loadtxt(fname,dtype=<class'float'>,comments='#',delimiter=None,converters=None,skiprows=0,usecols=None,unpack=False,ndmin=0,encoding='bytes',max_rows=None)
主要参数说明:fname:要读取的文件、文件名或生成器。dtype:数据类型,默认为float。comments:注释,如果行的开头为#就会跳过该行。delimiter:分隔符,默认为空格。converters:转换器,用于将特定列的数据转换为所需格式的字典。键为列索引(整数,从0开始),值为函数;转换器在读取数据后、数据类型转换前应用的。skiprows:跳过前几行读取,默认为0,必须是int整型。usecols:要读取哪些列,0是第一列,如usecols=(1,3)要读取列是第2列和第4列。默认是读取所有列。Unpack:如果为True,将分列读取。Numpy库(2)savetxt()函数savetxt()用于保存数组到文本文件,其语法如下:numpy.savetxt(fname,X,fmt='%.18e',delimiter='',newline='\n',header='',footer='',comments='#',encoding=None)参数说明:
fname:表示保存文件名或文件句柄。
X:
需要写入文件的数组数据(1D或2D)。
fmt:取值为格式序列的字符或多格式字符串,可选参数。
fmt=’%.3f’,格式为保留小数点后三位有效数字的浮点数。
fmt=’%4d’,格式为宽度为4的整数,若数的实际宽度>4,则按实际宽
fmt=’%4d’,格式与前面类似,不过对齐方式为右对齐。
delimiter:表示分隔符,默认以空格的形式隔开。newline:指定行尾标识符。
header:写在文件开头的内容,通常用于添加注释或说明,每行开头自动添加comments前缀。
footer:写在文件末尾的内容,与header类似,每行开头也会自动添加comments前缀。
comments:指定注释符号。
encoding:指定文件编码格式。用Numpy库实现实例8.2importnumpyasnp#读取文件中数据到列表scorescore=np.loadtxt('score.csv',str,delimiter=',',encoding='utf-8')#score是np.ndarry类型title=list(score[0])#标题行,numpy.ndarray类型-->list类型score=score[1:]#纯数据行#计算总分,并将转换为array类型scoreSum=[]forxinscore:scoreSum.append(str(sum(map(int,x[1:]))))newcol=np.array(scoreSum)#列表转换为NumPy一维数组
#将总分信息拼接到score中score=np.column_stack((score,newcol))#将newcol作为新列拼接到score数组右侧sorted_indices=score[:,-1].astype(float).argsort()[::-1]#转换为float再排序score=score[sorted_indices]title.append("总分")#增加行标题的总分title=np.reshape(title,(1,-1))#将标题列表转换为(1,列数)的2维数组,方能与数据数组拼接。#(行方向)将标题行和数据行拼接data=np.concatenate((title,score),axis=0)#以csv格式写回文件中np.savetxt("scoreSort.csv",data,fmt="%s,%s,%s,%s,%s",delimiter=",",encoding="utf-8")用Numpy库实现实例8.2①np.column_stack():是NumPy中用于将多个数组按列拼接的函数,它能将多个一维数组或二维数组沿列方向组合成一个新的二维数组。其核心特点是会自动处理一维数组的维度,使其符合拼接要求。②np.reshape():是NumPy中用于调整数组形状的函数,它可以在不改变数组元素的情况下,重新组织数组的维度结构。该函数不会修改原始数组的数据,而是返回一个新的形状的数组视图(在可能的情况下)或副本。③np.concatenate():是NumPy中用于沿指定轴拼接多个数组的核心函数,适用于拼接维度相同的数组(除拼接轴外,其他维度必须一致)。Pandas库Pandas是一个基于numpy的开源库,提供了高效且易用的数据结构,用于处理数据分析任务。它包含众多库和标准数据模型,为操作大规模数据集提供了实用工具,是让Python成为强大高效数据分析工具的关键因素之一。Pandas支持所有Python的数据类型,还额外兼容两种数据结构:一维数组Series和二维数组DataFrame。使用Pandas库之前需要先使用pip安装,
Pandas的安装方式为:pipinstallpandasPandas库(1)read_csv()使用read_csv()方法能将由常见分隔符分割的文本文件读取至DataFrame,该方法的主要参数及其含义如下。pandas.read_csv(filepath_or_buffer,sep='\t',delimiter=None,header='infer',names=None,engine=None,encoding=None)filepath_or_buffer:文件路径或URL。sep:分隔符,缺省值为'\t',当文本中的分隔符不是制表符时,可用sep=’分隔符’来指定。Python可自动检测分隔符。delimiter:参数sep的替代参数,缺省值为None。header:整型或整型列表,用作列名的行号和数据的开头。names:要使用的列名的列表,如果文件不包含标题行,则应显式传递header=None。engine:使用解析器引擎,其值可为'c'或'python'。c引擎速度更快,而Python引擎目前功能更加完善。encoding:默认None,编码在读/写时用UTF(例如'utf-8')。Pandas库(2)to_csv()使用to_csv()可将DataFrame数据写入到由常见分隔符分割的文本文件中,该方法的主要参数及其含义如下。DataFrame.to_csv(path_or_buf=None,sep=',',na_rep='',header=True,index=True,mode='w',encoding=None)path_or_buf:文件路径或文件对象,默认为None(返回为字符串)。sep:字段分隔符,默认为','(逗号)。na_rep:缺失值(NaN)的表示方式,默认为空字符串''。header:是否写入列名,默认为True(写入)。index:是否写入行索引,默认为True(写入)。encoding:文件编码格式,如'utf-8'、'gbk'等。columns:指定要写入的列,如columns=['col1','col2']。mode:文件打开模式,'w'写入(默认)、'a'追加等。用Pandas库实现实例8.2importpandasaspd#读取CSV文件score=pd.read_csv('score.csv',encoding="utf-8")#计算总分score['总分']=score['语文']+score['数学']+score['英语']#按总分降序排序score_sorted=score.sort_values(by='总分',ascending=False)#结果写入文件score_sorted.to_csv('scoreSort.csv',encoding="utf-8")①pandas库从文件中读取的数据是DataFrame类型,它通常将第一行数据视为列标题,相关数据引用可通过列标题引用,如代码中的score['语文']。②DataFrame.sort_values():是pandas中用于对DataFrame数据按指定列进行排序的方法。它可以根据一个或多个列的值对数据行进行升序或降序排列4JSON文件JSON文件JSON(JavaScriptObjectNotation)是一种目前被广泛使用的数据格式,常用于网页数据交互以及不同应用程序之间的数据交换。JSON数据格式源于JavaScript,但如今已演变为一种跨语言的通用数据交换格式。JSON是文本格式,使用unicode编码,默认utf-8方式存储。JSON的key必须用双引号引住字符串,不能用单引号。Python内置json库,用于对JSON数据的解析和编码,使用json库的dump()和load()方法,可以将不同类型数据写入文件或将数据从文件中读出恢复成原始数据类型数据。JSON文件JSON的两种基本结构是对象和数组1.对象(Object)由一组无序的键值对组成,使用花括号{}包裹。键必须是双引号括起来的字符串,值可以是任意合法JSON数据类型。键值对之间用逗号分隔,最后一个后面不能有逗号。示例:{"name":"李华","age":30,"employed":true,"skills":["JavaScript","Python"]}这个对象包含四个键值对,其中skills的值是一个数组。2.数组(Array)由一组有序的值组成,使用方括号[]包裹。•值可以是任意合法JSON数据类型(字符串、数字、对象、布尔值、null、数组等)。•值之间用逗号分隔。示例:["apple","banana","cherry",{"name":"fruitsalad","price":5.99}]这个数组包含四个元素:三个字符串和一个对象。3.组合使用实际JSON数据常常是对象和数组的嵌套组合,例如:{"users":[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]}根是一个对象,它的users键对应一个数组,数组里又包含多个对象。JSON文件编码语法及主要参数如下:json.dumps(obj,ensure_ascii=True,indent=None,sort_keys=False)json.dump(obj,
fp
,ensure_ascii=True,indent=None,sort_keys=False)json库默认ensure_ascii=True会将中文等非ASCII字符转为unicode编码(形如\uXXXX),设置ensure_ascii=False可以禁止json将中文编码转为Unicode编码,保持中文原样输出。Python中的字典是无序的,转为JSON默认不排序。可设置sort_keys=True使转换结果按照字典升序排序(a~z)。Indent用来对JSON数据进行格式化输出,默认值为None,不做格式化处理,也可设一个大于0的整数表示缩进量,例如indent=4。
输出的数据被格式化之后,可读性变得更好。dump(obj,fp)除了将obj转换为JSON格式的字符串,还会将字符串写入文件fp中。JSON文件JSON的编解码过程是将一个包含JSON格式数据的可读文件反序列化为一个Python对象。Python数据类型与JSON类型相互转换,主要使用json.loads(s)和json.load(fp)两个方法。编码语法及主要参数如下:json.dumps(obj,ensure_ascii=True,indent=None,sort_keys=False)json.dump(obj,fp,ensure_ascii=True,indent=None,sort_keys=False)方法描述json.loads(s)将字符串s中的JSON数据解码为Python数据类型,其他格式数据会变为unicode格式json.load(fp)将磁盘文件对象fp中的JSON数据解码为Python数据类型,其他格式数据会变为unicode格式JSON文件在编码和解码过程中存在着一个Python数据类型和JSON数据类型的转换过程,具体的转换关系对照见表。Python→JSONJSON→Pythondictobjectobjectdictlist,tuplearrayarrayliststr,unicodestringstringstrint、floatnumbernumber(int)intTruetruenumber(real)floatFalsefalsetrueTruefalseFalsenullNoneJSON文件importjsondata={'姓名':'李立','电话':'139×××76655','籍贯':'湖北'}print(data)#输出python的字典数据类型#转成JSON,ensure_ascii=False使非ASCII码字符原样输出dataJson=json.dumps(data,ensure_ascii=False)print(dataJson)#输出转换结果,字典转为json对象#转成JSON,indent格式化保存字典,数字为缩进空格数dataJson=json.dumps(data,sort_keys=True,ensure_ascii=False,indent=4)print(dataJson)#输出格式化后的转换结果withopen("test.json","w",encoding='utf-8')asf:json.dump(data,f,ensure_ascii=False,indent=4)importjsondata={'姓名':'李立','电话':'139×××76655','籍贯':'湖北'}dataJson=json.dumps(data,sort_keys=True,ensure_ascii=False,indent=4)print(dataJson)#输出转为json的结果#将json对象dataJson解码为Python中的字典print(json.loads(dataJson))withopen("test.json","r",encoding='utf-8')asf:#将文件对象f中的json数据解码为Python中字典dataPython=json.load(f)print(dataPython)实例8.3CSV格式转JSON格式学生课程成绩的文件“score.csv”中存有同学的成绩。请将文件内容转为JSON格式写入到新文件“score.json”中。分析:①以读的模式打开CSV文件,将文件中的数据读取出来,转化为Python的数据类型。以写(创建)的模式打开JSON文件,再用dump()函数将JSON格式数据写入文件中。实例8.3CSV格式转JSON格式#CSV文件中的数据转为JSON格式并写入文件importjson#打开CSV文件,读取数据进行格式转换withopen("score.csv","r",encoding='ansi')asdataCsv:ls=[]forlineindataCsv:#遍历dataCsv中的每一行line=line.strip()#去掉行末的空白字符(此处为换行符)ls.append(line.split(','))#加到列表ls中foriinrange(1,len(ls)):ls[i]=dict(zip(ls[0],ls[i]))#将列表第一列取出,用zip()函数将两个序列中对应序号元素组成键值对#打开JSON文件,将数据编码后写入withopen("score.json","w",encoding='utf-8')asdataJson:json.dump(ls[1:],dataJson,indent=4,ensure_ascii=False)将JSON文件转为CSV格式的操作正好与之相反。第一步是以读的模式打开JSON格式文件,用load()函数对其进行解码,将文件中的数据转为列表。第二步是以创建写的模式打开CSV格式文件,再将解码后的数据写入文件中。importjsonwithopen("score.json","r",encoding='utf-8')asdataJson:ls=json.load(dataJson)data=[list(ls[0].keys())]#返回字典中所有的键,作为列表的一个元素foriteminls:data.append(list(item.values()))#遍历字典,将字典中所有值逐行加入列表withopen("score_w.csv","w",encoding='ansi')asdataCsv:foritemindata:dataCsv.write(",".join(item)+"\n")#将元素间用逗号隔开,写入文件中5文件与文件夹操作Pythonos库常用方法
Python内置os库提供了大量和目录及文件操作相关的方法。使用“importos”语句导入os库后,即可使用其相关方法。方法描述os.getcwd()返回表示当前工作目录的字符串os.chdir(fd)将当前工作目录更改为文件描述符fd指向的目录,fd必须指向打开的目录而非文件。如os.chdir(r'c:\Users'),等效于os.fchdir(fd)os.mkdir(path)创建一个名为path的目录,权限参数mode的默认值为0o777,可修改数值以设置不同的权限os.remove(filename)移除(删除)文件filename。如果filename是目录,则抛出IsADirectoryError异常os.makedirs(path)递归目录创建函数,path为包含多层目录的字符串。与mkdir()类似,但会自动创建到达最后一级目录所需要的中间目录os.removedirs(path)递归删除目录,path为包含多层目录的字符串。工作方式类似于rmdir(),不同之处在于,如果成功删除了末尾一级目录,removedirs()会尝试依次删除path中提到的每个父目录,直到抛出错误为止os.rmdir(path)移除(删除)目录path。如果目录不存在或不为空,则会分别抛出FileNotFoundError或OSError异常os.rename(src,dst)将文件或目录src重命名为dstos.renames(old,new)递归重命名目录或文件。工作方式类似rename(),除了会首先创建新路径所需的中间目录。重命名后,将调用removedirs()删除旧路径中不需要的目录。os.listdir(path='.')返回一个列表,该列表包含了path中所有文件与目录的名称。该列表按任意顺序排列,并且不包含特殊条目'.'和'..',即使它们确实在目录中存在。缺省返回当前工作路径下的文件与目录名称os.walk(path)返回类型为生成器,包含数据为若干包含文件和文件夹名的元组数据os.path.getsize(file)文件file存在,返回其大小(byte为单位),不存在则报错Pythonos.path库常用方法
示例描述os.path.getsize(file)文件file存在,返回其大小(byte为单位),不存在则报错os.path.isfile(file)判断file是不是文件,是文件则返回True,否则返回Falseos.path.isdir(path)判断path是不是文件夹,是文件夹则返回True,否则返回Falseos.path.join(path,*paths)合理地拼接一个或多个路径部分。返回值是path和*paths所有值的连接os.path.exist(name)判断name文件夹或文件是否存在,存在返回True,否则返回Falseos.path.split(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计概念方案
- 环境设计市场发展分析与策略研究
- 海兴广场景观设计
- 环境宴会台面设计
- 2025-2026学年《5.3正方形》同步练习题浙教版八年级数学下册 含答案
- 防摔气囊设计
- 耳鼻喉科急性扁桃体炎护理方案
- 设计保研介绍
- 音乐可视化创意设计实例课程设计
- Spark日志处理入门教程课程设计
- 牛肝菌种植技术培训课件
- (独家!)公安建设发展“十五五”规划
- 体育行业体育赛事运营总监岗位招聘考试试卷及答案
- 酒店客房运营管理规范手册
- 辐射安全隐患排查
- 2025年六安辅警招聘考试真题完整参考答案详解
- 【小升初模拟】2026年人教版小升初模拟监测数学试卷(含解析)
- 2025年高考湖南试卷及答案
- 新解读《HJ 501-2009水质 总有机碳的测定 燃烧氧化-非分散红外吸收法》
- 2025年南通市中考道德与法治试题卷(含标准答案)
- 2024-2025学年四川省成都市成都七中高一(下)期末数学试卷(含答案)
评论
0/150
提交评论