python 集,这篇专栏的文章写以至此,已经囊括了编写组织有序而又易于使用的程序所需的基本技能。眼下,该考虑让程序目标更明确、用途更大了。
(python 的文件和异常)章节,我们将学习处理文件,让程序能够快速地分析大量的数据。 然后,学习错误处理,避免程序在面对意外情形时崩溃。 还有,学习异常,
它们是python 创建的特殊对象,用于管理程序运行时出现的错误。 最后,学习 json,它让你能够保存用户数据,以免在程序停止运行后丢失。
文件存储可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。
例如:你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件:
Tu_c.txt
创建好了文本内容。
下面的程序打开并读取这个文件,再将其显示到屏幕上:
with open('Tu_c.txt') as file_object:
contets = file_object.read()
print(contets)
在检查运行效果之前,先跟大家说明一下这里新接触到的新技能点:
如果你想使用一个文件的第一步必然是先打开这个文件。然后才能做到访问。open()函数接受一个参数,而这个参数就是你要打开文件的名称,然后 python 会在当前执行的文件所在的目录中查找指定的文件。文件被查找到以后,会以对象的形式返回。
with 关键字会在你不需要访问文件后将其关闭,这里我们用到了 open() 函数去读取文件,可是没有用到 与其相对应的 close () 函数来关闭文件,这是因为如果程序出现 bug,或者是异常关闭的情况,就会导致 文件的内容出现问题,例如丢失,无法访问。所以我们利用 with关键字,将文件的关闭工作 交给 python 去处理。
read() 函数负责读取 open() 获取到文件的内容,并将其作为一个长长的字符串存储在 contets中。
上面的示例,我们将 被读取的文件 和 定义读取程序放在了同级目录下,两者处于同一路径,我们直接通过 open 函数 python 就会帮助我们去执行,但!如果不在同一目录呢?也就是说,不在同一目录的条件下,open 函数中的参数我们该怎么定义呢?
一种方式就是通过相对路径来获取。
我们可以将代码这样进行定义:
with open('文件夹名称\Tu_c.txt') as file_object:
将代码这样定义,open函数就可以让python到指定文件夹下去寻找指定的文本文件了。
在windows系统当中,路径分隔符用反斜杠 \,而不是斜杠 /
亦或者也可以使用绝对路径,就是将 盘符,文件夹…文件名称,等一些列的准确路径告诉python。这种称为绝对路径。
由于绝对路径通常较长,建议将其存储在变量当中,
例如你可以这样定义代码:
file_pat =r'G:\python_tl\10'
with open(file_path) as file_object:
读取文件时,常常需要检查其中的每一行:
如果要以每次一行的方式检查文件,可对文件对象使用for循环。
filename ='hyf.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
在这段代码当中,我将定义好的文件名存储在一个变量当中,
又将存有路径的变量传入到 open() 函数当中,
with 关键字 为我们访问open函数接收到的文件内容,在通过 for循环 将其逐行打印出来。
逐行读取的区别在于,read() 函数的读取,不能读取太长的文件内容。
而逐行读取,会将文件里冗长的内容也逐行读取出来。
使用 with 关键字,open() 函数返回的对象只能在 with 代码块内使用。
如果要在 with 代码块外访问文件的内容,可在 with 代码块内讲文件的各行存储在一个列表中,并在 with代码块外使用该列表。
这样你就可以立即处理文件的各个部分,也可推迟到程序后面在处理。
filename ='hyf.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
在这段代码中,用到的 readlines() 函数从文件中读取每一行,并将其存储到一个列表当中;接下来,这个列表被存储到 变量 lines 当中,而 lines 变量,在 with 代码块之外也是可以使用的。
但是这段寒窑赋对比上面示例的那段为什么少了一行空行呢?
因为逐行打印结束之后,本身就会产生一行空行了,然而 print 语句,本身还有一行空行,所以就是两行空行。而这段示例中,在 print 输出内容时,调用了 rstrip() 函数,删除了一行空行,所以输出效果就剩下每段一个空行了。
将文件读取到内存当中,就可以以任何方式使用这些数据了。下面以简单的方式使用圆周率的值。
接着,先创建一个字符串,它包含文件中存储的所有数字,
且没有任何空格:
filename ='yzl.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string =''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
其实这段代码,就是基于 1.4 技能点的一个延伸。
还是像之前一样,用 with 来访问 open 接收到的参数,然后该文件的内容通过循环以逐行打印的方式 输出,而在输出之前,又定义了一个空的字符串变量,以清楚空格的形式将要输出的内容,全部赋值到变量当中。
做完了上述操作后,直接打印这个变量,并且多调用了一次 print() 语句,为的是通过 len 函数来查看一下 这个字符串中存储了多少个数字。
可是你知道吗?
你看到的这些数字并不是数字,而是字符串。如果你想输出真正意义上的字符串,
需要调用 int() 方法,将其转换类型。或者是 float() 将其转换为 浮点类型。
喜欢看兔c文章的同学,可以关注我一下。
明天给大家分享 python 的写入文件相关内容。