【Python】9.长宇

敢将剑撑寰

欲挽天河洗甲兵。

——张四维《双烈记·访道》

本期文章5800

根据之前文章的后台统计数据推算

本期预计所需阅读时间35分钟

本系列文章已加入“维权骑士”(rightknights.com)的版权保护计划

本文原创内容版权受到保护

通过Python代码打开文件

我们可以使用Python来读取和写入任何文件的内容。在所有文件类型中,纯文本文件是最容易进行操作的。

在编辑文件之前,我们必须使用open函数来打开它。通用结构如下:

myfile =open("文件")

在上面这个通用结构中,如果要打开的文件与现在的程序存放目录相同,则只需要在文件那里写要打开的文件的名字就可以(如test.txt,含后缀名);如果要打开的文件与现在的程序存放目录不同,就必须写完整的文件地址(如C:\test\1.txt)。

我们还可以通过向open函数传递第二个参数来指定打开文件的模式

如果第二个参数为“r”,则表示在只读模式下打开。这时仅限读取文件内容,代码不可以修改文件内容。这是默认设置,也就是说如果不传递第二个参数,则默认以只读模式打开文件。。

如果第二个参数为“w”,则表示在写入模式下打开,这时候打开的文件只用于写入如果指定的文件已经存在,则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,则创建新文件。

如果第二个参数为“w+”,则表示在读写模式下打开,这时候打开的文件除了用于写入,还可以用于读取文件内容,这是与写入模式唯一不同之处。如果指定的文件已经存在,则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,则创建新文件。

如果第二个参数为“a”,则表示在附加模式下打开。如果指定的文件已存在,新写入的内容将会被写入到已有内容的后面。如果指定的文件不存在,则创建新文件进行写入。

如果第二个参数为“b”,则表示在二进制模式下打开。这种模式一般用于打开非文本文件(例如图像和声音文件)。

以上是常用的几种文件打开模式。来看例子:

# write mode 写入模式

open("filename.txt","w")

# read mode 只读模式

#(默认模式,可以不写参数"r")

#(下面两种写法都是只读模式)

open("filename.txt","r")

open("filename.txt")

# binary mode 二进制模式

open("filename.txt","b")

我们知道,计算机的内存空间是有限的。在运行过程中打开的文件是被临时复制到内存中,以保证运行速度的(内存的读取速度比硬盘要快很多)。所以,打开并使用完文件后,我们应该关闭文件,腾出内存(“释放”被文件占用的内存)。

我们可以通过文件对象的close方法来关闭相应的文件。

(由于还没有说到面向对象的概念,所以“文件对象的close方法”可能不容易理解。可以看下面的例子)

f = open("test.txt", "w")

# 中间的文件处理过程省略

f.close()

在上面这个例子中,file就是文件test.txt所临时存放的对象。通过在对象名后面加一个点再后跟函数名(“方法”)来调用这个对象的相关功能(比如关闭文件"close"就是文件对象f的一个功能,每种对象的所有功能都对应着这种对象的一个方法,后续说到面向对象的编程的部分时会具体展开。)

通过Python代码读取文件

可以使用read方法读取以可读取模式(包含读写模式、只读模式等)打开的文件的内容。

file = open("test.txt", "r")

cont = file.read()

print(cont)

file.close()

上面这份代码将输出test.txt的内容。

测试题9.1.

重新排列下面这份代码各行之间的顺序,实现以下功能:打开文件→读取文件内容→输出文件内容→关闭文件。

print(cont)

file.close()

cont = file.read()

file = open("test.txt")

点击下方空白区域查看答案

file = open("test.txt")

cont = file.read()

print(cont)

file.close()

如果我们只需要读取文件的一部分,可以提供一个数字作为read函数的参数。这个参数决定了要读取的字节数。

当然,我们可以对同一文件对象进行多次方法调用,来向后继续读取文件的更多字节。如果某个read方法参数,那么这个read方法将返回文件所有后续部分。来看例子:

my_file=open("test.txt" , "w")

my_file.write("Hello! This is an example.")

my_file=open("test.txt" , "r")

my_file.read(2)

my_file.read(3)

my_file.read()

运行结果:

He

llo

! This is an example.

测试题9.2.

如果一个字符就占一个字节长度,且文件内容足够多的话,下面代码的每一行将输出几个字符?

file = open("test.txt", "r")

for i in range(21):

print(file.read(4))

file.close()

点击下方空白区域查看答案

4

read(4),每次读取4个字节。又因为一个字节就存储一个字符,所以每次输出4个字符。

当我们读取完文件中的所有内容后,如果我们尝试从该文件中继续读取内容,就将返回一个空字符串——因为我们在尝试从文件的末尾向后读取,当然读取不到任何东西。

file = open("test.txt", "r")

file.read()

print("上面的read方法已经读取了全部内容")

print("下面的read方法读不到任何东西!")

print(file.read())

print("Finished")

file.close()

运行结果:

>>>

上面的read方法已经读取了全部内容

下面的read方法读不到任何东西!

Finished

>>>

如果我们要对文件中的每一行建立一个索引值,我们可以使用readlines方法返回一个数组,这个数组中的每个元素都是文件中的一行(如果不是最后一行,就会在当前这行最后包含换行符)。

下面的例子假设文件一共有三行内容。

f = open("test.txt", "r")

print(f.readlines())

f.close()

运行结果:

>>>

['这是第一行的内容\n', '这是第二行的内容\n', '这是第三行的内容']

>>>

我们还可以直接使用for循环遍历文件中的每一行(下面的例子假设文件一共有三行内容):

f = open("test.txt", "r")

forlineinf:

print(line)

f.close()

运行结果:

>>>

这是第一行的内容

这是第二行的内容

这是第三行的内容

可以看到,在上面这个例子的输出结果中,每一行由空行分隔开了,这是因为像之前的例子一样,每一行最后的回车也被读取了出来,print函数就会把这个每行行尾的换行符也输出出来,所以每次输出后面都会多一个空行(最后一行与之前的例子同理除外)。

测试题9.3.

如果文件test.txt的内容一共有7行,那么下面代码的输出结果是?

len(open("test.txt").readlines())

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803G01E9B00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券