【Python基础知识】(九)文件和异常

读取文件

1、读取和程序位于同一目录下的文件

假设已经创建了一个文本文件pi_digits.txt,内容是精确到小数点后30位的圆周率值,且在小数点后每10位处都换行。如下所示:

3.1415926535
  8979323846
  2643383279

下面的程序将打开并读取这个文件,再将其内容打印到屏幕上。注意:不论是以任何方式使用文件,都要先打开它。

‘‘‘文件名:file_reader.py‘‘‘
with open(‘pi_digits.txt‘) as file_object:‘‘‘定义变量file_object作为表示文本文件的对象‘‘‘
    contents = file_object.read()
    print(contents)

该程序中的open()函数执行打开文件的操作,它接受文件的名称作为参数,并返回一个表示该文件的对象。Python将这个对象存储在变量file_object中,以便后续使用。

方法.read()会读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样,通过打印contents的值,就可以将这个文本文件的全部内容显示出来。

注意:当不指明文件路径时,Python只会在当前执行文件所在的目录中查找指定的文件,即file_reader.py

输出为:

3.1415926535
  8979323846
  2643383279

   方法.read()到达文件末尾时返回一个空字符串,这个空字符串在输出中显示出来就是一个空行。可通过在print语句中使用方法.rstrip()的方式来删除这个空行。

2、提供文件路径来读取文件

   当要打开不在程序文件所属目录中的文件时,可通过提供该文件存储路径的方式使Python找到该文件并打开。路径分为相对文件路径绝对文件路径两种。当给出相对文件路径时,要求该文件位于存储执行程序的文件夹内,并且需要给出它直接存储的文件夹,因为Python此时只会在给出的文件夹下查找,而不会再进入该文件夹的子文件夹查找

‘‘‘在Windows系统中,文件路径使用反斜杠(\);而在Linux和OS X中,使用斜杠(/)‘‘‘with open(‘text_files\filename.txt‘) as file_object:‘‘‘提供相对文件路径,Python将在该文件夹下查找(不查找子文件夹)‘‘‘
file_path = ‘C:\Users\ehmatthes\other_fies\text_files\filename.txt‘‘‘‘当文件路径过长时,也可以将路径作为字符串存储在一个变量中‘‘‘with open(file_path) as file_object:‘‘‘提供绝对文件路径,Python将在指定的文件夹中查找‘‘‘

 3、逐行读取文件

读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。此时可以通过使用循环来遍历文件的每一行。

filename = ‘pi_digits.txt‘
with open(filename) as file_object:
    for line in file_object:
        print(line)

同样的,使用.rstrip()可消除每一行末的换行符,进而消除输出中的空白行。

   也可以通过将文件存入一个列表的方式,使得可以在with代码块外访问该文件的内容。

filename = ‘pi_digits.txt‘
with open(filename) as file_object:
    lines = file_object.readlines()
‘‘‘将文件存入新建的列表lines。方法.readlines()从文件读取每一行,并将每一行文字作为字符串存储入列表中‘‘‘
for line in lines:
    print(line.rstrip())

下列程序可让文件作为一个长字符串输出

filename = ‘pi_digits.txt‘
with open(filename) as file_object:
    lines = file_object.readlines()
‘‘‘定义字符串变量pi_string,初始值为空字符串‘‘‘
pi_string =  ‘‘‘‘‘将文件一行一行的拼接起来,存入pi_string中‘‘‘for line in lines:
    pi_string += line.strip()

print(pi_string)‘‘‘还可以求整个文件的长度‘‘‘
print(len(pi_string))

输出为:

3.141592653589793238462643383279
32

4、在文件中查找信息

‘‘‘在圆周率中查找某人的生日‘‘‘filename = ‘pi_digits.txt‘
with open(filename) as file_object:
    lines = file_object.readlines()

pi_string =  ‘‘
for line in lines:
    pi_string += line.strip()

birthday = input("Enter your birthday in numbers: ")
if birthday in pi_string:
    print("Found.")
else:
    print("Not Found.")

操作文件

当open函数中只有一个参数时,Python会默认以只读方式(‘r‘)打开这个文件;当有两个参数时,Python会根据第二个参数确定对文件进行操作的方式。不同的操作方式有只读模式‘r‘,只读取文件)、写入模式‘w‘清空原有文件内容并写入,如果文件不存在则自动创建)、附加模式‘a‘,在原文件末尾添加内容,如果文件不存在则自动创建)以及读取和写入文件模式‘r+‘,‘r‘+‘a‘)

注意:Python只能将字符串写入文本文件,如果想要将其他类别的内容(如数值数据)存储到文本文件中,要先使用str()转换为字符串格式。

filename = ‘programming.txt‘

‘‘‘在写入模式写入内容‘‘‘with open(filename, ‘w‘) as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

‘‘‘在附加模式添加内容‘‘‘with open(filename, ‘a‘) as file_object:
    file_object.write("I also love swimming.\n")
    file_object.write("I also love reading.\n")

输出为:

I love programming.
I love creating new games.
I also love swimming.
I also love reading.

函数write()不会在写入和附加的文本末尾添加换行符,如果需要换行的话要记得自行添加。

异常

1、异常的概念

Python使用被称作异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常,异常将指示Python当出现该错误时应该怎么做,而不是显示traceback给用户。异常是使用try-except代码块处理的。

例如,当我们输入一行有错误的代码时:

print(5/0)

   当没有编写处理异常的代码时,Python会进行报错:

Traceback (most recent call last):
  File "Hello World.py", line 1, in <module>
    print(5/0)
ZeroDivisionError: division by zero

   当你认为某个地方可能发生错误时,就可以用try-except来编写一段代码,来处理可能引发的异常

try:
    print(5/0)‘‘‘给出一种可能会出现错误的输入‘‘‘
except ZeroDivisionError:
    print("You can‘t divide by zero!")‘‘‘指示Python当上述代码出现ZeroDivisionError错误时该如何处理‘‘‘

   这样,当出现同样的错误时,用户将看到一条友好的错误信息,而不是traceback。

You can‘t divide by zero!

2、异常的实际应用

通过在程序中编写相关代码,可有效防止程序在某些特定情况下崩溃。并且,当程序没有出现异常时,我们还能使用else语句添加新的代码,这些代码在程序出现异常时不会被执行。

print("Enter ‘q‘ to quit.")
while True:
    first_number = input("\nFirst number: ")
    if first_number == ‘q‘:
        break
    second_number = input("Second number: ")  ‘‘‘处理ZeroDivisionError异常的代码‘‘‘
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can‘t divide by 0!")  ‘‘‘当程序没有出现异常时执行‘‘‘
    else:
        print(answer)

  

类似的,还可以编写处理FileNotFoundError(找不到文件)异常的代码。

filename = ‘alice.txt‘
try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except FileNotFoundError:
    message = "Sorry, the file " + filename + " does not exist."
    print(message)‘‘‘当程序没有出现异常时执行‘‘‘
else:
    ‘‘‘计算文件中包含的单词数‘‘‘
    words = contents.split()
    num_words = len(words)
    print("The file " + filename + " has about " + str(num_words) + " words.")

特别的,当你希望程序在出现异常时不进行任何操作,就像无事发生一样继续进行时,可以在except中使用pass语句,它会指示Python什么都不做

print("Enter ‘q‘ to quit.")
while True:
    first_number = input("\nFirst number: ")
    if first_number == ‘q‘:
        break
    second_number = input("Second number: ")
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        pass
    else:
        print(answer)

参考书籍:《Python编程:从入门到实践》

2020-07-27

相关推荐