2021-08-04

第十章:文件和异常

10.1 从文件中读取数据

读取整个文件(文件名一定不能加文件类型后缀

file_name = 'pi_digits'
# 打开并读取这个文件
# 使用with关键字
with open(file_name) as file_object:
    content = file_object.read()
print(content)

  1. with open(file_name) as file_object

    要以任何方式使用文件,都要先打开文件。open()接受文件名称,python在当前执行的文件所在目录查找指定的文件

    open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

    open(file, mode='r')
    

    完整的语法格式为:

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    

    参数说明:

    • file: 必需,文件路径(相对或者绝对路径)。
    • mode: 可选,文件打开模式
    • buffering: 设置缓冲
    • encoding: 一般使用utf8
    • errors: 报错级别
    • newline: 区分换行符
    • closefd: 传入的file参数类型
    • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

    mode 参数有:

    模式描述
    t文本模式 (默认)。
    x写模式,新建一个文件,如果该文件已存在则会报错。
    b二进制模式。
    +打开一个文件进行更新(可读可写)。
    U通用换行模式(Python 3 不支持)。
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  2. 若要去除空行,可以使用content.rstrip(),去除最后一行的空格

文件路径

  • 绝对路径:file_path = '/home/a.txt' ==(代表系统根目录下的文件路径)==

  • 相对路径:file_path = ‘text_filrs/file_name.txt’

    使用/就可以若一定要使用, 则需要使用\转意

    import os
    print(os.getcwd())
    file_name = os.getcwd()+'/pi_digits'
    with open(file_name) as file_obj:
        content = file_obj.read()
    print(content.rstrip())
    
    
    • Import os

    • print(os.getcwd())#获取当前工作目录路径
      print(os.path.abspath('.')) #获取当前工作目录路径
      print(os.path.abspath('test.txt'))#获取当前目录文件下的工作目录路径
      print (os.path.abspath('..') )#获取当前工作的父目录 
      print (os.path.abspath(os.curdir)) #获取当前工作目录路径
      

      运行结果

      /Users/wanghaonan/PycharmProjects/FileAndException获取当前工作目录路径
      /Users/wanghaonan/PycharmProjects/FileAndException
      /Users/wanghaonan/PycharmProjects/FileAndException/test.txt
      /Users/wanghaonan/PycharmProjects
      /Users/wanghaonan/PycharmProjects/FileAndException

逐行读取

# 逐行读取
file_name = 'pi_digits'
with open(file_name) as file_obj:
    # 逐行读取
    for line in file_obj:
        print(line.rstrip())

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

# 创建列表
with open(file_name) as file_obj:
    lines = file_obj.readlines()

print(lines)
运行结果:['李志宁 = 清华学子\n', '真的很厉害\n', '吴鹤:北大学子\n', '也很厉害']

使用文件的内容

pi_string = ''
for line in lines:
    pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))

运行结果:
李志宁 = 清华学子真的很厉害吴鹤:北大学子也很厉害
26
注意事项

Line = line.replace(‘李志宁’)

line.replace(‘李志宁’) 对原字符串没有做出更改

必须要用line = line.replace(‘李志宁’)

10.2 写入文件

# 写入空文件file_name = 'programming.txt'with open(file_name, 'w') as file_obj:    file_obj.write('I love programming\n')# 写入多行并附加到文件with open(file_name, 'a') as f:    f.write('I love creating new games\n')
  • open(file_name, ‘w’)中第二个参数w告诉python要以写入模式打开这个文件。

  • 若需要添加换行效果,需要加入换行符\n

  • ‘a’代表附加模式,不会删除文件原有内容。

10.3 异常

 print(5/0) ZeroDivisionError: division by zero

其中,zeroDivision是异常对象,解决应使用try-except代码块:

try:    print(5/0)except ZeroDivisionError:    print('You can not divide by zero')

try_except_else代码块具体结构

print("Give me two answers, and I'll divide them")print("Enter 'q' to quit")while True:    first_number = input('\nFirst number: ')    if first_number == 'q':        break    second_number = input("\nSecond_number: ")    if second_number == 'q':        break    try:        answer = int(first_number) / int(second_number)    except ZeroDivisionError:        print('You can not divide by 0')    else:        print("\n"+str(answer))
Try 中只包含可能出现错误的代码,except代码块告诉Python,出现异常时的处理办法。else部分为仅当try部分代码正确运行时才需要运行的代码。

分析文本(Alice.txt)

获得文本单词数(使用str.spilt(),获取单词列表长度)
try:    file_name = 'alice.txt'    with open(file_name,encoding='utf-8') as f:       content = f.read()except FileNotFoundError:    print(f"Sorry,the file {file_name} does not exist")else:    words = content.split()    words_num = len(words)    print(f'The file {file_name} has about {words_num} words')
静默失败

在python出现异常时,告诉python什么都不要做。(==注意except里的pass关键字)

def count_words(file_name):    """计算一个文件大概包含多少单词"""    try:        with open(file_name, encoding='utf-8') as f:            content = f.read()    except FileNotFoundError:       pass    else:        words_num = len(content.split())        print(words_num)file_name = 'alice1.txt'count_words(file_name)

10.4 存储数据(JSON格式文件)

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

import jsonnumbers = [3, 5, 7, 9, 11]file_name = 'numbers.json'#当创建文件时,要选择‘w'模式with open(file_name, 'w') as f:    json.dump(numbers, f)with open(file_name) as f:    numbers_1 = json.load(f)print(numbers_1)

10.4.2 保存和读取用户生成的数据

import jsonfile_name = 'user_name.json'try:    with open(file_name) as f:        user_name = json.load(f)except FileNotFoundError:    file_name = 'user_name.json'    user_name = input('what is your name')    with open(file_name, 'w') as f:        json.dump(user_name, f)        print(f"We'll rememeber you when you come back")else:    print(f"welcome back,{user_name}")

10.4.3 重构

重构函数:每个函数都执行单一而清晰的任务,我们调用greet_user(), 它打印一条合适的信息:要么欢迎老用户回来,要么问候新用户。为此,它首先调用get_stored_username(), 该函数只负责获取易存储的用户名,最后在必要时调用get_new_username(),该函数只负责获取并存储新用户的用户名。要编写出清晰而易于维护和扩展的代码,这种划分必不可少。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值