python基础知识——文件和异常

 1. 读文件

1.1 读取整个文件

  • with open('a.txt') as f1:
        contents = f1.read()
        print(contents)

    a.txt文件位于程序所在的目录中

    关键字with在不再需要访问文件后将其关闭,使用with可以使你只负责打开文件,并在需要时使用它,python自会在合适的时候自动将其关闭

  • 传递给函数open()的参数可以是相对路径,如with open(‘files/a.txt’) as f1:,相对路径是相对于当前运行程序所在的目录
  • 传递给函数open()的参数可以是绝对路径,如下所示
  • path = 'D:\Python\codes\pi_digits.txt'
    with open(path) as f1:
        contents = f1.read()
        print(contents)

1.2 逐行读取

  • filename = 'pi_digits.txt'
    
    with open(filename) as f1:
        for line in f1:
            print(line)

    运行结果

    3.14159265357979
    
       32384626433832
    
       79
  • 打印每一行时,因为每行末尾都有一个换行符,print语句也会加上一个换行符,因为每行末尾都有两个换行符,要消除这些多余的空白行,可在print语句中使用rstrip()函数,如print(line.rstrip())

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

  • 使用关键字with时,open()返回的文件对象只在with代码块内可用
  • 若要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表
  • filename = 'pi_digits.txt'
    
    with open(filename) as f1:
        lines = f1.readlines()
    
    for line in lines:
        print(line.rstrip())

    readlines()方法从文件中读取每一行,并将其存储在一个列表中,该列表被存储到变量lines中

2. 写文件

  • 调用open()时提供了两个实参,第二个实参可以是'r'读取模式,'w'写入模式,'a'附加模式,'r+'读取和写入,若省略,则默认以只读模式打开文件
  • python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式
  • 函数write()不会在写入的文本末尾自动添加换行符,所以可以手动添加空格、制表符或空行来设置输出的格式
  • 若要给文件添加内容,而不是覆盖原有内容,可以附加模式打开文件
  • filename = 'pi_digits.txt'
    
    with open(filename, 'a') as f1:
        f1.write("\nI love programming.")

3. 异常

3.1 使用异常 

  • python使用被称为异常的特殊对象来管理程序执行期间发生的错误
  • 若编写了处理异常的代码,程序将继续运行;若未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告
  • 异常是使用try-except代码块处理的,使用try-except代码块之后,即使出现异常,程序也将继续运行
  • try:
        print(5/0)
    except ZeroDivisionError:
        print("You can't divide by zero!")

    运行结果

    You can't divide by zero!
  • else代码块:依赖于try代码块成功执行的代码都放到else代码块中
  • try-except-else代码块的工作原理大致如下:python尝试执行try代码块中的代码(只有可能引发异常的代码才需要放在try语句中),若发生了except指定的异常,则运行except代码块;若try代码块成功执行,则运行else代码块
  • print("Give me two numbers, and I'll divide them.")
    print("Enter 'q' to quit.")
    
    while True:
        first = input("\nFirst number: ")
        if first == 'q':
            break
        second = input("Second number: ")
        if second == 'q':
            break
        try:
            answer = int(first) / int(second)
        except ZeroDivisionError:
            print("You can't divide by 0!")
        else:
            print(answer)

3.2 处理FileNotFoundError异常

  • def count_words(filename):
        '''计算一个文件大致包含多少个单词'''
        try:
            with open(filename) as f1:
                contents = f1.read()
        except FileNotFoundError:
                msg = "Sorry, the file " + filename + " does not exist."
                print(msg)
        else:
            #计算文件大致包含多少个单词
            words = contents.split()
            num = len(words)
            print("The file " + filename + " has about " + str(num) + " words.")
    
    filenames = ['a.txt', 'pi_digits.txt']
    for filename in filenames:
        count_words(filename)

    运行结果

    Sorry, the file a.txt does not exist.
    The file pi_digits.txt has about 8 words.

3.3 发生错误时直接略过

  • 我们并非每次在捕获到异常时都告知用户,有时你希望程序在发生异常时什么也不做
  • python有一个pass语句,可在except代码块中使用pass告诉python发生异常时什么都不要做
  • except FileNotFoundError:
                pass

4. 存储数据

4.1 使用json.dump()和json.load() 

  • 下面演示了如何使用json.dump()来存储数字列表
  • import json
    
    numbers = [2, 3, 5, 7, 11]
    
    filename = 'numbers.json'
    with open(filename, 'w') as f1:
        json.dump(numbers, f1)

    程序运行之后,文件numbers.json的内容为

    [2, 3, 5, 7, 11]
  • 下面演示了如何使用json.load()将这个列表读取到内存中
  • import json
    
    filename = 'numbers.json'
    with open(filename) as f1:
        numbers = json.load(f1)
    
    print(numbers)

    运行结果为

    [2, 3, 5, 7, 11]

5. 重构

  • 重构——将代码划分为一系列完成具体工作的函数
  • 重构使代码更清晰,更易于理解,更容易扩展
posted @ 2021-07-24 15:34  bky-16  阅读(99)  评论(0编辑  收藏  举报