Python编程笔记10文件和异常

Python编程学习笔记,第10记:文件和异常

         本章节,将学习:如何使用文件;如何一次性读取整个文件;如何以每次一行的方式读取文件的内容;如何写入文件;如何将文本附加到文件末尾;什么是异常;如何处理程序可能引发的异常;如何存储Python数据结构,以存储用户提供的信息……

# 10.1 从文件中读取数据

# 10.1.1读取整个文件

  • # 读写一个文件之前需要打开它,可使用函数open()打开文件,语法如下:
  • # fileobject = open(filename, mode)

# 下面是对该 open() 调用的简单解释:
# •fileobject 是 open() 返回的文件对象;
# •filename 是该文件的字符串名;
# •mode 是指明文件类型和操作的字符串。

# mode 的第一个字母表明对其的操作。
# r 表示读模式。
# w 表示写模式。如果文件不存在则新创建,如果存在则重写新内容。
# x 表示在文件不存在的情况下新创建并写文件。
# a 表示如果文件存在,在文件末尾追加写内容。
# mode 的第二个字母是文件类型:
# •t (或者省略)代表文本类型;
# •b 代表二进制文件。

  • # 打开文件之后就可以调用函数来读写数据。
  • # 最后需要关闭文件。

# 接下来在一个程序中用open()打开一个文件'pi_digits.txt',并打印出其内容。

# 文件名为:file_reader.py
with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)

输出结果为:

3.1415926535
8979323846
2643383279
5028841971
6939937510
5820974944

……

# 会看到输出的结果跟文件中的一样.(为了节省位置,这里没有全部粘贴出来)

 

# 函数 open()

# 接受一个参数:要打开的文件的名称.Python在当前执行的文件所在的目录中查找指定的文件.

# 关键字 with 在不再需要访问文件后将其关闭.在这个程序中,注意到我们调用了 open() ,但没有调用 close() ;

# 你也可以调用 open() 和 close() 来打开和关闭文件,但这样做时,如果程序存在 bug ,导致 close() 语句未执行,文件将不会关闭.

# 这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损.

# 如果在程序中过早地调用 close() ,你会发现需要使用文件时它已关闭 (无法访问),这会导致更多的错误.

# 并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,

# 可让 Python 去确定:你只管打开文件,并在需要时使用它, Python 自会在合适的时候自动将其关闭.

# 函数 open() 返回一个表示文件的对象.

 

# 有了表示 pi_digits.txt 的文件对象后,我们使用方法 read() 读取这个文件的全部内容,

# 并将其作为一个长长的字符串存储在变量 contents 中.

# 这样,通过打印 contents 的值,就可将这个文本文件的全部内容显示出来.

 

# 10.1.2 文件路径

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

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

# 要让 Python 打开不与程序文件位于同一个目录中的文件,需要提供文件路径,它让 Python 到系统的特定位置去查找.

# 可使用相对文件路径来打开该文件夹中的文件.

# 相对文件路径让 Python 到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的.

 

# 在 Linux 和 OS X 中,在文件路径中使用斜杠( / ).
# 例如:with open('text_files/filename.txt') as file_object:

# 在 Windows 系统中,在文件路径中使用反斜杠( \ )而不是斜杠( / ).
# 例如:with open('text_files\filename.txt') as file_object:

 

# 你还可以将文件在计算机中的准确位置告诉 Python,这样就不用关心当前运行的程序存储在什么地方了.
# 这称为绝对文件路径.在相对路径行不通时,可使用绝对路径.
# 绝对路径通常比相对路径更长,因此将其存储在一个变量中,再将该变量传递给 open() 会有所帮助.
# 在 Linux 和 OS X 中,绝对路径类似于下面这样的,如:
# file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
# with open(file_path) as file_object:

 

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

# 就目前而言,最简单的做法是,要么将数据文件存储在程序文件所在的目录,

# 要么将其存储在程序文件所在目录下的一个文件夹(如 text_files )中.

 

# 注意:Windows 系统有时能够正确地解读文件路径中的斜杠.
# 如果你使用的是 Windows 系统,且结果不符合预期,请确保在文件路径中使用的是反斜杠.
# 另外,由于反斜杠( \ )在Python中被视为转义字符,
# 为在windows中确保万无一失,应以字符串的形式指定路径,即在开头的单引号前加上r.

 

# 10.1.3 逐行读取

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

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

# 文件名为:file_reader.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line)

输出结果为:

3.1415926535

8979323846

2643383279

5028841971

……

# (为了节省位置,这里没有全部粘贴出来)

# 为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,

# 而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,

# 另一个来自print 语句。要消除这些多余的空白行,可在print 语句中使用rstrip().

# 文件名为:file_reader.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())  # 删除字符串末尾空白.

输出结果为:

3.1415926535
8979323846
2643383279
5028841971

……

# 会看到输出的结果跟文件中的一样.(为了节省位置,这里没有全部粘贴出来)

# 在这里也使用了关键字 with ,让Python负责妥善地打开和关闭文件;通过对文件对象执行循环来遍历文件的每一行。

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

# 使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。
# 如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,
# 并在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。
 
# 文件名为:file_reader.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines() # 方法readlines()从文件中读取每一行,并将其存储在列表中。
    
for line in lines:
    print(line.rstrip())  # 删除字符串末尾空白.

输出结果为:

3.1415926535
8979323846
2643383279
5028841971

……

# 会看到输出的结果跟文件中的一样.(为了节省位置,这里没有全部粘贴出来)

# 10.1.5 使用文件中的内容

# 删除每行末尾的换行符,并打印出文件中内容

# 文件名为:file_reader.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines()  # 方法readlines()从文件中读取每一行,并将其存储在列表中。

pi_string = ''
for line in lines:
    pi_string += line.rstrip()  # 删除字符串末尾空白.
    
# 打印这个字符串及其长度:
print(pi_string)  
print(len(pi_string))

输出结果为:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211
177

# 注意:

# 读取文件时,Python将其中的所有文本都解读为字符串。

# 如果你读取的是数字,并要将其作为数值使用,就必须使用函数 int() 将其转换为整数,

# 或使用函数 float() 将其转换成浮点数。

 

# 10.2 写入文件

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

# 10.2.1 写入空文件

# 10.2 写入文件
# 保存数据最简单的方式之一是将其写入到文件中。
# 文件名:write_message.py
filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

 

# 如果要写入的文件不存在,函数open()将自动地创建它。

# 然而,以写入(‘w’)模式打开文件时要千万小心,

# 因为如果指定的文件已存在,Python将在返回文件对象前清空该文件。

# Python只能将字符串写入到文件中。要将数值数据存储到文件中,必须先使用函数 str()将其转换成字符串格式。

 

# 10.2.2 写入多行

# 函数write()不会在你写入的文本末尾添加换行符,

# 因此如果写入的内容较多时没有指定换行符,文件看起来可能不是希望的那样。

# 10.2.2 写入多行
# 函数write()不会在你写入的文本末尾添加换行符,
# 因此如果写入的内容较多时没有指定换行符,文件看起来可能不是希望的那样。
# 文件名:write_message.py
filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love creating a new games.")

打开工程目录下的'programming.txt'文件,可以看到结果为:

I love programming.I love creating a new games.

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

# 要让每个字符串都单独占一行,需要在write()语句中包含换行符.
# 文件名:write_message.py
filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating a new games.\n")

打开工程目录下的'programming.txt'文件,可以看到结果为:

I love programming.

I love creating a new games.

 

 

 

 

【未完,待续……】

 

 

 

“在没有事实(数据)作为参考的情况下妄下结论是个可怕的错误。”

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值