Python基础——9.文件

本文介绍了Python中处理文件的基础知识,包括如何读取文件的全部内容、逐行读取、创建包含文件内容的列表,以及写入文件的技巧,如写入空文件、追加内容。还提到了使用eval函数处理文件内容以及错误处理和异常的概念,强调了这些技能对于程序的实用性和稳定性的重要性。
摘要由CSDN通过智能技术生成

Python基础——9.文件

9.0 前言

至此,你掌握了编写组织有序而易于使用的程序所需的基本技能,该考虑让程序目标更明确、用途更大了。

在本章中,你将学习处理文件,让程序能够快速地分析大量的数据;你将学习错误处理,避免程序在面对意外情形时崩溃;

你将学习异常,它们是Python创建的特殊对象,用于管理程序运行时出现的错误;你还将学习模块json ,它让你能够保存用户数据,以免在程序停止运行后丢失。

学习处理文件和保存数据可让你的程序使用起来更容易:用户将能够选择输入什么样的数据,以及在什么时候输入;

用户使用你的程序做一些工作后,可将程序关闭,以后再接着往下做。学习处理异常可帮助你应对文件不存在的情形,以及处理其他可能导致程序崩溃的问题。

这让你的程序在面对错误的数据时更健壮——不管这些错误数据源自无意的错误,还是源自破坏程序的恶意企图。

你在本章学习的技能可提高程序的适用性、可用性和稳定性。

9.1 从文件中读取数据

文本文件可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。

每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。

例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

9.1.1 读取整个文件

要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:

以下是test.txt的内容,你也应在你的代码目录下新建一个这样的文件:

Use Python read file!
Do you know it?
It's very useful!

下面的程序打开并读取这个文件,再将其内容显示到屏幕上:

with open('test.txt') as f:
    contents = f.read()
    print(contents)

预想的输出结果应该是:

Use Python read file!
Do you know it?
It's very useful!

在这个程序中,第1行代码做了大量的工作。我们先来看看函数open() 。

要以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开 文件,这样才能访问它。

函数open()接受一个参数:要打开的文件的名称。

Python在当前执行的文件所在的目录中查找指定的文件。

9.1.2 文件路径

当你将类似test.txt这样的简单文件名传递给函数open() 时,Python将在当前执行的文件(即.py程序文件)所在的目录中查找文件。

根据你组织文件的方式,有时可能要打开不在程序文件所属目录中的文件。

例如,你可能将程序文件存储在了文件夹python_work中,而在文件夹python_work中,有一个名为text_files的文件夹,用于存储程序文件操作的文本文件。

虽然文件夹text_files包含在文件夹python_work中,但仅向open() 传递位于该文件夹中的文件的名称也不可行,因为Python 只在文件夹python_work中查找,而不会在其子文件夹text_files中查找。要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径 ,它让Python到系统的特定位置去查找。

由于文件夹text_files位于文件夹python_work中,因此可使用相对文件路 径来打开该文件夹中的文件。相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的。你可以这样编写代码:

在Mac OS和linux使用下面这种方式打开:

with open('text_files/filename.txt') as f:
    contents = f.read()
    print(contents)

这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。

在Windows系统中,在文件路径中使用反斜杠(\ )而不是斜杠(/ ):

with open('text_files\\filename.txt') as f:
    contents = f.read()
    print(contents)

你还可以将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方了。这称为绝对文件路径 。

在相对路径行不通时,可使用绝对路径。例如,

file_path = 'C:\\Users\\ehmatthes\\other_files\\text_files\\filename.txt'

with open(file_path) as file_object:
    pass

通过使用绝对路径,可读取系统任何地方的文件。

9.1.3 逐行读取

读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。

例如,你可能要遍历一个包含天气数据的文件,并使用天气描述中包含字样sunny的行。

在新闻报道中,你可能会查找包含标签 的行,并按特定的格式设置它。

要以每次一行的方式检查文件,可对文件对象使用for 循环:

filename = 'test.txt' # ❶ 
with open(filename) as f: # ❷ 
    for line in f:# ❸ 
        print(line)

打印的时候发现空白行多了:

Use Python read file!

Do you know it?

It's very useful!

为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。

要消除这些多余的空白行,可在print 语句中使用rstrip() :

filename = 'test.txt' # ❶ 
with open(filename) as f: # ❷ 
    for line in f:# ❸ 
        print(line.rstrip())

现在,输出又与文件内容完全相同了

9.1.4 创建一个包含文件各行内容的列表

使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。

如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。

下面的示例在with 代码块中将文件test.txt的各行存储在一个列表中,再在with 代码块外打印它们:

filename = 'test.txt' 
with open(filename) as f:
    li = f.readlines()
    print(li)

输出结果如下:

['Use Python read file!\n', 'Do you know it?\n', "It's very useful!"]

9.1.5 使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。

下面以简单的方式使用test.txt中的值。

filename = 'test.txt' 
with open(filename) as f:
    li = f.readlines()

s = li[1][:-5] + ' ' + li[0][:-2] + " " + li[2]
print(s)

输出的结果如下所示,我并未整理大小写字母请将就一下:

Do you know Use Python read file It's very useful!

9.2 写入文件

保存数据的最简单的方式之一是将其写入到文件中。

通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。

9.2.1 写入空文件

要将文本写入文件,你在调用open() 时需要提供另一个实参,告诉Python你要写入打开的文件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,而不是将其打印到屏幕上:

filename = 'Python.txt'
with open(filename, 'w+') as file_object:
    file_object.write("I love Python.")

这样将会把"I love Python." 写入文件中

如果你要写入的文件不存在,函数open() 将自动创建它。因为我们在w后面有个“+”号,否则将会报错(文件不存在)

然而,以写入(‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

相比于你的计算机中的其他文件,这个文件没有什么不同。你可以打开它、在其中输入新文本、复制其内容、将内容粘贴到其中等。

9.2.2 写入多行

函数write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,文件看起来可能不是你希望的那样:

filename = 'Python.txt'
with open(filename, 'w') as f:
    f.write("I love Python3.8")
    f.write("I love Python2.7")

如果你打开Python.txt,将发现两行内容挤在一起:

I love Python3.8I love Python2.7

要让每个字符串都单独占一行,需要在write() 语句中包含换行符:

filename = 'Python.txt'
with open(filename, 'w') as f:
    f.write("I love Python3.8\n")
    f.write("I love Python2.7\n")

现在,输出出现在不同行中:

I love Python3.8
I love Python2.7

像显示到终端的输出一样,还可以使用空格、制表符和空行来设置这些输出的格式。

9.2.3 追加到文件

如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件。

你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。

如果指定的文件不存在,Python将为你创建一个空文件。

filename = 'Python.txt'
with open(filename, 'a') as f:
    f.write("This is append mode\n")

现在Python.txt的内容如下:

I love Python3.8
I love Python2.7
This is append mode

9.3 使用eval函数自动处理文件内容

如果我们想把一个列表文件写入文件,以便我们下次使用,你可能会进行以下操作:

li1 = [1,2,3,4]
# 写入
with open("list.txt","w+") as f:
    for i in li1:
        f.write(str(i)+"\n") # 注意,只能写入字符串
    f.close()
# 读取
li2 = []
with open("list.txt","r+") as f:
    temp = f.readlines()
    for i in temp:
        li2.append(i.replace("\n","")) # 去除\n

但是现在你可以使用eval函数来帮助我们进行如此操作:

li1 = [1,2,3,4]
# 写入
with open("list.txt","w+") as f:
    f.write(str(li1))
    print(str(li1))
    f.close()
# 读取
li2 = []
with open("list.txt","r+") as f:
    li2 = eval(f.read())
    print(li2)
    print(type(li2))

输出结果如下,可以看到写入的是经过字符串处理的li1,而加载到内存中的li2也是重新变回了我们需要的list对象:

[1, 2, 3, 4]
[1, 2, 3, 4]
<class 'list'>

集合、字典、元组也都是可行的。

你已经掌握了基本调试的能力,你可以在结合之前学习的知识来验证自己的猜想。

9.4 小结

在本章中,你学习了:
如何使用文件;
如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;
如何写入文件,以及如何将文本附加到文件末尾;
如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供。

文件操作不需要学习太多,懂得读、写、追加三种基础操作再加上一些有利于日后使用的小技巧就足够了。

Python基础——结束

至此,Python基础专栏要结束了。如果你有更好的建议或者还留有疑惑,可以向我提出意见和问题,我将虚心结束或悉心指导。

结束,同时也意味着新的开始。在学习的路上是永无止境的,往后我们将使用我们所学的Python知识,制作出自己的有意思的小项目。

在Python的学习道路上,我将一直伴随着大家!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值