Python⽂件和数据格式化
(1).⽂件的使⽤
1)⽂件的类型
⽂件是数据的抽象和集合,可以理解为⽂件是存储在辅助存储器上的数据序列,是数据存储的⼀种形式。具体来说,⽂件都是以⼆进制⽅式来存储的,但是它有不同的展现形态。在程序设计中⼀般有两种展现形态,分别叫⽂本⽂件和⼆进制⽂件。
⽂本⽂件和⼆进制⽂件只是⽂件的展⽰⽅式。从本质上来讲,所有⽂件都是以⼆进制形式存储在计算机上。但是形式上我们将存储的⽂件由程序读出进⾏使⽤时,那么⽂件就可以采⽤⽂本⽅式或⼆进制⽅式进⾏处理。这两种⽅式其实可以应⽤于任何⽂件上,但是有些⽂件天然是⽂本⽂件,有些⽂件天然是⼆进制⽂件。
因为⽂件是数据的抽象和集合,如果这些数据是由单⼀特定编码组成,那这样的⽂件就是⽂本⽂件,⽐如我们使⽤UTF-8编码将所有的信息进⾏组织,并且在⼀个⽂件中只⽤这样的编码去存储数据,那么这样的⽂件就叫⽂本⽂件。由于存在编码,⽂本⽂件也被看成是存储着的长字符串,简单来说,⽂本⽂件就是⼀个字符串,⽐如WIndows系统中的.txt⽂件、Python的源⽂件.py⽂件等。
⼆进制⽂件是指直接由⽐特0、1构成的⽂件,⽽在这个⽂件中,数据之间没有使⽤统⼀的字符编码。在这样的⽂件中,⼀般0、1是根据⼀些预定义的格式进⾏了结构组织,它形成了⼀些特定的⽂件类型,⽐如.png⽂件、.avi⽂件等,它们本⾝就是有很多的0、1按照特定的⽅式进⾏组织,对于这些0、1之上是不存在任何编码,这类⽂件就叫⼆进制⽂件。
所有⽂件都是以⼆进制0、1形式存储,有统⼀编码的称之为⽂本⽂件,没有统⼀编码的称之为⼆进制⽂件,但是⽆论什么类型的⽂件都可以以⼆进制⽅式打开。
2)⽂件的打开和关闭
Python和其他语⾔类似,在处理⽂件时遵循⼀个特定的步骤:打开-操作-关闭。
对于⼀个⽂件,如果不对它进⾏处理的时候,它体现的是⼀个⽂件的存储状态,此时⽂件在计算机的硬盘中存储。如果⼀个程序想处理⼀个⽂件,⾸先要使这个⽂件变成占⽤状态,在占⽤状态中,⼀个程序可以唯⼀的、排它的对⽂件进⾏相关的处理。那么⽂件的存储状态和⽂件的占⽤状态之间通过⽂件的打开和关闭进⾏转换,所以在⽂件处理之间我们需要对⽂件进⾏打开,处理完成后我们需要对⽂件进⾏关闭。在打开⽂件之后,我们可以对⽂件进⾏数据读⼊和数据输出,简称为读⽂件和写⽂件。
Python提供了三个常⽤的读⽂件函数,分别是read(size)、readline(size)和readlines(hint)。也提供了三个常⽤的写⽂件函数,分别是write(s)、writelines(lines)和seek(offset)。
A.⽂件的打开
打开⼀个⽂件使⽤open(<⽂件名>,<;打开模式>)函数,<⽂件名>参数是⽂件的路径和名称,指的是当前要打开的⽂件与当前程序所对应的位置之间的关系;<;打开模式>参数是打开模式,包括以⽂本形式打开,或以⼆进制形式打开,打开的过程是读信息还是写信息。
使⽤open()函数打开⽂件后,将其赋给⼀个变量名,这个变量名被称之为⽂件句柄。
A-1.<⽂件名>参数
<⽂件名>参数是⽂件的路径和名称,可以是⽂件的绝对路径和名称,也可以是⽂件的相对路径和名称。
举个例⼦:⽐如有⼀个⽂件在Windows平台上保存在D:\,我们在使⽤open()函数打开这个⽂件的时候,需要指定这个路径,那么它可以有四种表达⽅式。第⼀种⽅式,我们直接给出当前⽂件的绝对路径,但是需要注意Python中\表⽰转义,所以需要使⽤\\转义为\,所以<⽂件名>参数实际为"D:\\PYE\\f.txt";第⼆种⽅式,也是使⽤绝对路径,但是我们使⽤/来代替\,所以<⽂件名>参数实际
为"D:/";第三种⽅式,使⽤相对路径,如果当前的程序在D:\⽬录下,那么<⽂件名>参数实际为"./";第四种⽅式,使⽤相对路径,如果当前程序在D:\PYE\⽬录下,那么<⽂件名>参数实
际为"f.txt"。
⽆论采⽤哪种⽅式,最终⽬的是要让程序在它运⾏的当前⽬录下,能够很好的或者有效的到这个⽂件。⽆论是绝对路径还是相对路径,只要能够到这个⽂件,并且指定正确的⽂件名称,那么读取这个⽂件就会⽐较顺利
A-2.<;打开模式>参数
Python语⾔提供了7种<;打开模式>,它们之间并不是完全排它的。
⽂件的打开模式描述
'r'只读模式,默认值,如果⽂件不存在,返回FileNotFoundError异常
'w'覆盖写模式,如果⽂件不存在则创建,如果⽂件存在则覆盖⽂件原有内容
'x'创建写模式,如果⽂件不存在则创建,如果⽂件存在则返回FileExistsError异常
'a'追加写模式,如果⽂件不存在则创建,如果⽂件存在则在⽂件最后增加内容
'b'⼆进制⽂件模式,即以⼆进制形式打开⽂件
't'⽂本⽂件模式,默认值,即以⽂本形式打开⽂件
'+'与r/w/x/a⼀起使⽤,在原有的功能基础上扩展为同时具备读写功能
⽂本形式和⼆进制形式:⽐如⼀个⽂件“中⽂测试.txt”,内容是⼀段字符串“中国是个伟⼤的国家!”,我们可以⽤⽂本形式理解它,也可以⽤⼆进制形式理解它。以⽂本形式理解它的时候,这个字符串使⽤了统⼀的编码,如果此时使⽤print函数将它打印(print(open("中⽂测试.txt","rt").read())),那么输出的结果就是“中国是个伟⼤的国家!”这样⼀段汉字。但是如果我们以⼆进制形式理解它,使⽤print函数将它打印(print(open("中⽂测试.txt","rb").read())),那么它返回的是⼀串由⼆进制构成的字符
串“b'\xd6\xd0\xb9\xfa\xca\xc7\xb8\xf6\xce\xb0\xb4\xf3\xb5\xc4\xb9\xfa\xbc\xd2\xa3\xa1'”,简单说返回的是“中国是个伟⼤的国家!”对应的存储形态的⼆进制形式。
显然我们使⽤的时候,通过⽂本形式可以更好的理解这段信息,⽽⼆进制形式是它最原始的存储格式。所以在使⽤时,⼀个⽂件是⽂本⽂件,我们⼜需要对它⾥⾯的字符进⾏理解,那么我们就要⽤⽂本形式将它打开,如果我们仅仅需要使⽤它的存储形式,我们就⽤⼆进制形式将它打开并处理。
<;打开模式>参数实例:
f=open("f.txt") #使⽤⽂本形式、只读模式这两个默认参数
f=open("f.txt","rt") #同上
f=open("f.txt","w") #⽂本形式、覆盖写模式
f=open("f.txt","a+") #⽂本形式、追加写模式和读模式
f=open("f.txt","x") #⽂本形式、创建写模式
f=open("f.txt","b") #⼆进制形式、只读模式
f=open("f.txt","wb") #⼆进制形式、覆盖写模式
B.⽂件的关闭
关闭⼀个⽂件使⽤<;变量名>.close()函数,没有任何参数,<;变量名>是打开时的⽂件句柄。
注意:如果⼀个程序中打开⼀个⽂件,⽽始终没有使⽤close()函数去关闭这个⽂件,那么在程序运⾏时这个⽂件始终是被打开状态,但是当程序退出,那么Python解释器会⾃动的将这个⽂件关闭。
3)⽂件内容的读取
Python提供了三个⽂件内容读取的⽅法,分别是.read、.readline和.readlines。
操作⽅法描述
<f>.read(size=-1)默认读⼊⽂件全部内容,如果给出size参数具体值,那么读⼊⽂件中前size长度的字符信息(注意:当存在⽂件句柄时,存在指针)
>>> open("中⽂测试.txt").read(2)
'中国'
<f>.readline(size=-1)默认从⽂件中读⼊⼀⾏,如果给出size参数具体值,那么读⼊该⾏的前size长度的字符信息>>> open("中⽂测试.txt").readline()
'中国是个伟⼤的国家!'
<f>.readlines(hint=-1)默认读⼊⽂件所有⾏,以每⼀⾏为⼀个元素形成⼀个列表,每⼀个元素是⼀个字符串。如果给出hint参数具体值,那么读⼊⽂件前hint⾏
>>> open("中⽂测试.txt").readlines()
['中国是个伟⼤的国家!']
遍历⽂件实例:
#遍历全⽂本⽅法⼀。特点:⼀次读⼊,统⼀处理;弊端:如果⽂本⽂件特别⼤,⼀次性读⼊将会耗费⾮常多的时间和资源。fname=input("请输⼊要打开的⽂件名称:")
fo=open(fname,"r")
ad() #整个⽂件变成⼀个⼤的字符串
#省略对全⽂txt进⾏处理的步骤
fo.close()
#遍历全⽂本⽅法⼆。特点:分阶段按数量读⼊,逐步处理,对于处理⼤⽂件这种⽅法更有效。
fname=input("请输⼊要打开的⽂件名称:")
fo=open(fname,"r")
ad(2)
while txt != "":
#省略对全⽂txt进⾏处理的步骤
ad(2)
fo.close()
#逐⾏遍历⽂件⽅法⼀。特点:⼀次读⼊,分⾏处理;弊端:如果⽂本⽂件特别⼤,⼀次性读⼊将会耗费⾮常多的时间和资源fname=input("请输⼊要打开的⽂件名称:")
fo=open(fname,"r")
for line adlines():
#省略对全⽂txt进⾏处理的步骤
fo.close()
#逐⾏遍历⽂件⽅法⼆。特点:分⾏读⼊,逐⾏处理
fname=input("请输⼊要打开的⽂件名称:")
fo=open(fname,"r")
for line in fo:
#省略对全⽂txt进⾏处理的步骤
fo.close()
4)⽂件写⼊数据
Python提供了两种数据写⼊⽂件的⽅法以及⼀种辅助函数。
操作⽅法描述
<f>.write(s)向⽂件写⼊⼀个字符串或⼀个字节流s
<f>.writelines(lines)将⼀个元素全为字符串的列表lines,拼接成⼀⾏后直接写⼊⽂件,中间没有分隔符
<f>.seek(offset)⽤来改变当前⽂件操作指针位置的函数。offset有三个参数:0表⽰⽂件处理指针直接回到⽂件的开始处;1表⽰⽂件处理指针回到⽂件的当前位置;2表⽰⽂件处理指针直接回到⽂件的结尾处
实例:
#实例⼀
fo=open("","w+")
ls=["中国","美国","⽇本"]
fo.writelines(ls)
for line in fo:
print(line)
fo.close()
#输出结果为空,因为数据在写⼊⽂件后,当前⽂件处理的指针处于写⼊的数据的结尾处,⽆法获取前⾯的数据,所以有了实例⼆。
#实例⼆,将实例⼀进⾏修改,打印⽂件修改后的信息
fo=open("","w+")
ls=["中国","美国","⽇本"]
fo.writelines(ls)
fo.seek(0) #指针回到⽂件开始位置
for line in fo:
print(line)
fo.close()
#此时输出结果为:中国美国⽇本
(2).⼀维数据的格式化和处理
1)数据组织的维度
从⼀个数据到⼀组数据,这是编写程序或者理解世界的⼀个很重要的跨度。⼀个数据表达⼀个含义,⼀组数据表达⼀个或多个含义。 对于⼀组数据,我们是采取线性⽅式(⼀维)进⾏组织,还是采⽤⼆维⽅式进⾏组织或者多为⽅式进⾏组织,这就能构成不同的数据组织形式。
其中,⼀维数据是由对等关系的有序或⽆序数据构成,采⽤线性⽅式组织。⼀维数据对应了传统Python程序中的列表、数组和集合等类型的概念。⼆维数据是由多个⼀维数据构成,是⼀维数据的组合形式,并且在⽣活中⾮常常见,⽐如:排⾏榜。进⼀步还有多维数据,它是由⼀维或⼆维数据在新的维度上的⼀种扩展⼆形成的,⽐如:排⾏榜已经是⼆维数据,但是当加⼊了时间维度,就构成了多维数据。除了⼀维数据、⼆维数据和多维数据之外,数据组织还有⼀种⾼维组织⽅式,它仅利⽤最基本的⼆元关系,来展⽰数据间的复杂结构,最常见的就是字典,如下:
对于数据来讲,还存在⼀个操作周期的概念。由于数据必须存在才能处理,所以将数据分为数据存储、数据表⽰和数据操作三个阶段。数据存储指的是数据在磁盘中的存储状态,在这⼀部分我们关⼼的是数据存储所使⽤的的格式。数据表⽰指的是程序表达数据的⽅式,在这⼀部分我没关⼼的是数据类型。如果数据能够由程序中的数据类型进⾏很好的表达,我们就可以借助这样的数据类型对数据进⾏操作,具体操作体现在相关的操作⽅式和算法。
2)⼀维数据的表⽰
如果⼀维数据之间存在顺序,我们可以使⽤列表类型来表达⼀维数据。列表类型是表达⼀维数据,尤其是⼀维有序数据最合理的数据结构。
如果⼀维数据之间没有顺序,我们可以使⽤集合类型来表达⼀维数据。集合类型是表达⼀维⽆序数据
最好的结构。
我们可以使⽤for循环遍历⼀维数据,进⽽对每个数据进⾏处理。
3)⼀维数据的存储
我们将⼀维数据存储在硬盘上或者存储在⽂件中有很多种⽅式,其中最简单的⽅式是把数据之间采⽤空格进⾏分隔,即使⽤⼀个或多个空格分隔数据并且进⾏存储,只⽤空格分隔,不换⾏,这是⼀种简单的⼀维数据存储⽅式。
同理,我们可以将空格替换为任意⼀个字符或多个字符来作为分隔符,但需要保存数据中不存在改分隔符,这也是它的缺点。
4)⼀维数据的处理
这⾥的⼀位数据的处理指的是数据存储与数据表⽰之间的转换,也就是说就是如何将存储的⼀维数据读⼊程序并表达为列表或集合,或者反过来,如何将程序表⽰的数据写⼊到⽂件中。
从⽂件中读取⼀维数据:
#⽂件内容为“中国⽇本美国法国德国英国”
f=open("")
ad()
ls=str.split()
f.close()
print(ls)
#输出结果为['中国', '⽇本', '美国', '法国', '德国', '英国']
#⽂件内容为“中国n$n⽇本$n美国$n法国$n德国$n英国”
f=open("")
ad()
ls=str.split('$n')
f.close()
print(ls)
#输出结果为['中国n', '⽇本', '美国', '法国', '德国', '英国']
将程序的⼀维数据写⼊到⽂件:
ls=['中国','美国','⽇本']
f=open("","w")
f.write(' '.join(ls)) #join()函数是将前⾯的字符串作为分隔符添加到后⾯的字符串的字符之间(或列表的元素之间)
f.close()
#⽂件内容变为“中国美国⽇本”
ls=['中国','美国','⽇本']
f=open("","w")
f.write('$n'.join(ls))
f.close()
#⽂件内容变为“中国$n美国$n⽇本”
(3).⼆维数据的格式化和处理
1)⼆维数据的表⽰
⼆维数据⼀般是⼀种表格形式,由于它的每⼀⾏具有相同的格式特点,⼀般采⽤列表类型来表达⼆维数据,这⾥所说的列表是⼆维列表。⼆维列表指的是它本⾝是⼀个列表,⽽列表中的每⼀个元素⼜是⼀个列表,其中每⼀个元素可以代表⼆维数据的⼀⾏或⼀列,若⼲⾏和若⼲列组织起来形成的外围列表就构成了⼆维列表。
在Python中表达⼆维数据⼀般采⽤⼆维列表,但在数据分析或⼤数据处理时,还有更⾼级或更有效的结构来表⽰⼆维数据。
使⽤⼆维列表表达⼆维数据时,可以使⽤两层for循环遍历每⼀个元素。在外围列表中,每⼀个元素可以对应⼆维数据的⼀⾏,也可以对应⼀列,具体对应⼀⾏还是⼀列,要根据具体应⽤⽤程序确定。
2)CSV数据存储格式与⼆维数据的存储
CSV全称Comma-Separated Values,指的是由逗号分隔的值,简单来说就是⽤逗号来分隔值的⼀种存储⽅式。⽤逗号来分隔值,是国际通⽤的⼀种⼀、⼆维数据存储格式,⼀般这样的⽂件以.csv作为扩展名,其中每⾏是⼀个⼀维数据,采⽤逗号来分隔,并且⽂件中没有空⾏,那么不同⾏就构成了另⼀个维度。
CSV⽂件可以使⽤Office Excel软件打开,并且保存。另外,⼀般的编辑软件都可以⽣成或转换为CSV格式。CSV格式是数据转换之间的通⽤的标准格式。如图,将表格转换为CSV格式。
在CSV数据存储格式中还有⼀些约定:1.如果某个元素在⼆维数据中缺失了,那么必须要为它保留⼀个逗号;2.在⼆维数据的表中,它的表头可以作为数据存储,也可以另⾏存储;3.逗号是英⽂半⾓逗号,逗号与数据之间没有额外的空格;4.⼆维数据可以按⾏存,也可以按列存,具有由程序决定,但是默认是先⾏后列,即外围列表的每⼀个元素是⼀⾏;5.在不同的编辑软件中转换CSV格式,当元素中需要包含逗号时,那么可能会在元素两端出现引号包裹,也可能采⽤转义符,需要按照实际情况进⾏处理。
3)⼆维数据的处理
从CSV格式的⽂件读⼊数据:
#读⼊⽂件内容为
#中国,⽇本,朝鲜,韩国
#法国,德国,意⼤利,俄罗斯
fo=open("测试⽂件.csv")
ls=[]
for line in fo:
place("\n","")
ls.append(line.split(","))
fo.close()
print(ls)
#输出结果为[['中国', '⽇本', '朝鲜', '韩国'], ['法国', '德国', '意⼤利', '俄罗斯']] 将保存在列表中⼆维数据写⼊csv⽂件中:
ls=[['中国', '⽇本','韩国'],['美国','加拿⼤','古巴']]
fo=open("测试⽂件.csv","w")
writelines()方法将什么写入文件for item in ls:
fo.write(','.join(item)+'\n')
f.close()
#⽂件内容变为
#中国,⽇本,韩国
#美国,加拿⼤,古巴
⼆维数据的逐⼀处理:
ls=[[1,2],[3,4],[5,6]]
for row in ls:
for column in row:
print(column,end=" ")
#输出结果为1 2 3 4 5 6
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论