从零开始的Python计划#9.1-文件


好久不见,太久没更新了,最近事情有点多。
这章主要会讲文件介绍,将数据写入文件,从文件中读取数据以及处理异常。

文件输入输出简介

要使程序在运行期间保留数据,必须保存数据。
----数据保存到文件中,通常保存在计算机磁盘上。
----保存的数据可以在以后检索和使用。

文件对于在打开和关闭应用程序之间保存数据非常有用。

输出文件是数据写入的文件;
输入文件:从中读取数据的文件。

程序使用文件时的三个步骤:
–—打开文件
–—处理文件(读/写)
–—关闭文件

将数据写入文件并读取

当我们将数据写入文件时就会发生这种情况:
在这里插入图片描述
有一个pay_rate变量和employee_id变量和employee_name变量。数据从内存RAM中复制出来(RAM是一种快速随机存取存储器,在我们不把文件保存到某个地方之前一直在使用它并被保存在磁盘),磁盘的特定位置供日后使用或咨询。
在这里插入图片描述
当我们从文件中读取数据时,我们使用Python脚本在我们的磁盘里,我们搜索数据,数据从文件复制到内存中,这里是更容易更快访问的地方。可以被变量使用,所以我们可以把之前存储在磁盘上的数据存储回变量中。所以pay_rate会有18.65这个值…(RAM就像是中介)

文件类型和文件访问方法

不同类型的文件有不同文件的访问方法。
一般来说,当我们用Python处理文件时,有两种类型的文件:
----文本文件:包含已编码为文本的数据。(文本文件可以在Mac上用文本编辑创建,在Windows上用记事本创建,在Linux上用nano创建)
----二进制文件:包含尚未转换为文本的数据。可包含任何类型的数据和代码以及计算机存储和处理的二进制文件。

访问文件中存储的数据的两种方法:
----顺序访问:文件从头到尾顺序读取,不能向前跳。
(所以我们读的是一个完整的文件,没有跳过的机会)
在这里插入图片描述
----直接访问可以直接跳转到文件中的任何数据。(因此不必一步一步地读取整个文件,更自由, 更直接。)
在这里插入图片描述

文件名和文件对象

文件显然有文件名还有一个对象的概念。
文件扩展名:在文件名末尾出现句点的短字符序列。扩展名指示文件中存储的数据类型。(每个文件都有一个扩展名,文本文件可以有txt,Doc文件可以有doc,电影可以有mov或mp4等…这就可以告诉我们的电脑存储了什么类型的文件。)
文件对象是在Python中与特定文件相关联的对象。这个概念为程序提供了一种方法来处理变量引用的文件对象。(如下图所示:)
在这里插入图片描述
有一个variabke_name变量过去连接一个文件对象,该对象引用到磁盘上的特定文件。所以我们的文件对象使我们的程序去处理文件,是个中介,它被变量引用了,然后进去设法与磁盘中的文件和数据通信。

在Python中打开文件

用python打开一个文件非常简单,会有一个函数,这个函数叫做open。
open函数:用于打开文件:
–—创建一个文件对象并将其与磁盘上的文件关联
–—一般格式:file_variable = open(filename, mode)

mode:是一个指定文件打开方式的字符串。我们可以用不同的方式打开文件:r,w,a。
只读('r')没有机会编辑和修改文件上的数据 、 写入('w')可以把数据写在文件上 , 附加('a')可以在文件中附加数据而不必编辑已存在的内容。

例如我们可以有一个customer_file,它是一个保存文件对象的变量。customer_file = open(“customer.txt”, “r”)就是把一个字符串指向一个名为customer.txt的文件,它存储在我们的笔记本中,然后会把mode‘r’传递给它,这是在读文件,把数据存储在对象中。

如果open函数接收到不包含路径的文件名,则假定那个文件和程序在同一目录下。(如果我们要打开的文件和脚本在同一个地方,我们可以给它起个名字。如果文件存储在电脑的其他地方,我们得说清楚文件在哪儿。)
可以在“open函数”参数中指定替代路径和文件名。在路径字符串文本前面加上字母r (如果文件存储在其他地方,我们可以指定文件的确切位置,并在路径字符串文字前加上字母r作为前缀。例如:test_file = open(r’C:\Users\Blake\temp\test.txt’, ‘w’)

写入文件

文件对象正确的方法是用于将数据写入文件中:用到write方法。格式:file_variable.write(string)
应使用文件对象close方法关闭文件,格式:file_variable.close()
举例:
在这里插入图片描述
创建一个新文件函数,首先要做的第一件事情就是打开此文件Frist_Python_File.txt,write模式。
调用file.write,“\n”表示看不见的新字符(每次放的时候就开始写新的一行代码)
调用…
调用…
当我们写完时,可以用.close关闭文件
然后打印一个File created,让我们的用户知道我们已经完成了对文件的写入。
最后调用create_new_file(),这将在我保存脚本的同一文件夹中创建一个名为First Python_file.txt的新文件,文件将包含First line,Second line和Third line,这三行在不同的行上面,因为在每个字符串的末尾都加了“\n”。

从文件读取数据

从文件中读取数据非常与写相似。
read方法:将整个文件内容读入内存的文件对象方法:
–—仅当文件已打开进行读取时才有效
–—作为字符串返回的内容,
格式:content = file_variable.read()

readline方法:从文件中读取行的文件对象方法:(不是读整个文件) 该行作为字符串返回,包括 ‘\n’(选择读取的行作为字符串返回)格式:line = file_variable.readline()

在这里插入图片描述

举例:
一个叫做read_data的函数,我们要做的是从上面读取数据,要读的是First_Python_File.txt(之前前面所建立的文件),
三次调用read_line,我们都会转到文件的下一行,因此这三个方法调用将存储在这三个变量中之前文件的三行。
当完成阅读时,调用close方法并将三个内容打印给控制台。
运行代码(最后一行应改为read_data() )

使用循环处理文件

文件通常用来保存大量数据,通常文件中存储的项目数是未知的。
循环通常涉及从文件中读写,循环可以帮助我们遍历文件并读取所有内容。
流程图过程:
在这里插入图片描述
1:打开文件
2:用readline从文件中读取第一行
3:询问readline是否返回了一个空字符串。如果字符串不是空的就意味着文件还有内容要传递。我们要继续存储文件中的内容。再用readline读第二行,一遍一遍地重复直到python脚本发现没有文本为止。
4:关闭文件

当到达文件末尾时,readline方法会使用一个空字符串作为前哨。空字符串意味着文件完成了,所以我们可以用它来检查文件是否真的完成了。在文件到达末尾时,要退出循环:while line != ''

举例子:
file = open(“MyFile.txt", "r")  '将MyFile.txt作为读取文件打开并将其存储在file变量里'
line = file.readline()  "创建一个line变量并读取文本的第一行 "
while line !='':  "如果line变量不同于空字符串,就会打印出来并继续,会一直持续下去直到找到空行为止"
        print(line)
        line = file.readline()
        
file.close()

将数据追加到现有文件

用“w”模式打开一个文件时,如果该文件已存在,则会被覆盖。 如果使用w文件不存在,python会创建一个文件。但是如果使用w并且文件已经存在了,python会删除这个文件并创建一个全新的。所以如果我们不想删除存在的文件的内容。而是想把东西加进去,我们需要用到a。
要将数据附加到文件,使用“a”模式:
----如果文件存在,则不删除它,如果文件不存在,则创建它。
–----在当前内容的末尾将数据写入文件

写入和读取数字数据:
---数字必须先转换为字符串,然后才能写入文件。str函数可以将任何数值转换为字符串。
----数字可以作为字符串从文本文件中读取。必须转换为数值类型才能执行数学运算。使用int和float函数将字符串转换为数值。

分割函数

也有一些可以在文件中使用的新函数—split函数。
**Readline函数返回一个字符串。在某些情况下,您可能需要将一个大字符串分解为较小的块或字符串。**当我们有个很长的代码行并需要分开时,可以用到split函数。

x = "blue,red,green" 
colours = x.split(",") "在x上调用了split方法,把,逗号作为参数给它"
print(colours)

当我们打印出来:
在这里插入图片描述
split方法需要一个很长的字符串并提供一个分隔符,在这种情况下这个逗号创造了迭代,就变成了列表。在这种情况下,取字符串的每个元素,直到找到逗号为止。当找到逗号时,将其存储在与列表相反的位置,然后为下一个创建一个新的元素。

当我们有一个更长的字符串时:

words = "This is random text we’re going to split apart" 
words2 = words.split(" ")"调用split传递给它一个空白。"
print(words2)

当打印出来时:
在这里插入图片描述
会有一个完整的单字列表。

也可以使用split拆分对象:

class Employee:
	def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.salary = salary
        
	def get_employee_info(self):
		print( "Employee name is: %s" %self.name) 
		print("Employee age is: %d" %self.age) 
		print("Employee salary: is %f" %self.salary)
#为类实例化
employee_1 = "Julian, 45, 35000.00" #将字符串放入变量里
employee_2 = "Sarah Smith, 22, 26000.00" #这基本上会像对字符串的作用一样作用于对象。这可以来自函数file.readline()

emp1_lst = employee_1.split(",")
emp2_lst = employee_2.split(",")#这里拿走了employee的对象,应用split在emp1_1st里存储起来。这样就可以从文件或输入函数中的任意位置获取此字符串。

emp1_obj = Employee(emp1_lst[0], int(emp1_lst[1]), float(emp1_lst[2])) 
emp2_obj = Employee(emp2_lst[0], int(emp2_lst[1]), float(emp2_lst[2]))#通过刚刚使用split创建的间隔,可以从employee类中创建一个对象。将在上面零位置创建的列表作为name传递。依次传递参数。

emp1_obj.get_employee_info() 
print() # new line 
emp2_obj.get_employee_info()

这个代码输出是:
在这里插入图片描述
split对于接收复杂的字符串并将其传递给对象关联创建单个元素非常有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章