Python 笔记 --文件和异常

目录

 1. 读取文件

1.1 逐行读取,创建包含文件各行内容的列表

2. 写入文件

3. 异常

3.1 traceback

3.2 try-except、else代码块

3.3 分析文本

4. 存储数据

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

4.2 重构


1. 读取文件

with open('1.txt') as file_object:
#with open('/Users/USERS/Python/1.txt') as file_object:
    contents = file_object.read()
    print(contents.rstrip())

读文件,首先要打开一个文件。函数 open() 接受的参数是要打开的文件名称时,Python 将在当前执行的文件所在的目录中查找文件。函数 open() 接受的参数是 文件的绝对路径+要打开的文件名称时,Python 将根据路径执行查找文件。

关键字 with 在不需要访问文件后将其关闭,使用关键字with时,open() 返回的文件对象只在with代码块内使用,可将值存储在一个列表中,并在with代码块外使用该列表

使用方法 read() 读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量 content 中。同时,因为 read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可以在末尾使用 .rstrip() 。用于删除字符串末尾的空白。

输出:3.1415926535
           8979323846
           2643383279

1.1 逐行读取,创建包含文件各行内容的列表

逐行读取

filename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/1.txt'
lists = []
with open(filename) as file_object:
    for line in file_object:
        print(line)
        #print(line.rstrip())       # 删除每一行末尾的空行

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

filename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/1.txt'

with open(filename) as file_object:
    lists = file_object.readlines()  # .readlines() 从文件中读取每一行

pi_string = ''
for line in lists:
    print(line.rstrip())
    pi_string += line.rstrip()       # 删除每一行末尾的空行

print(pi_string)
print(pi_string[:15] + '...')
print(lists)

输出:     3.1415926535
                8979323846
                2643383279
                3.141592653589793238462643383279
                3.1415926535897...
                ['3.1415926535\n', '8979323846\n', '2643383279']

2. 写入文件

writefilename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/2.txt'
with open(writefilename, 'w') as file_object:    #在文件中写入内容
    file_object.write('sdf mlkm h0oewi')

with open(writefilename) as file_object:
    print(file_object.readlines())      # .readlines() 从文件中读取每一行

写文件内容时,open() 有两个参数,第一个是要打开的文件名,第二个是指定读取的模式。

如:   ‘ r '  的可读模式,’ w ‘ 的可写模式(清空写), ’ a ‘ 的附加模式, ’ r+ ‘ 的读取和写入模式。

Python 只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数 str() 将其装换为字符串格式。同时,如果想要字符串都单独占一行,需要在 write() 语句中包含换行符。也可以使用空格,制表符和空行来设置这些输出格式。

writefilename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/2.txt'
num = 21334231
with open(writefilename, 'w') as file_object:
    file_object.write('sdf mlkm h0oewi\n')
    file_object.write('grw kok ewe 5y\n')   # 按行写入
    file_object.write(str(num))

with open(writefilename) as file_object:
    for line in file_object:
        print(line.rstrip())      # .readlines() 从文件中读取每一行

输出:     3.1415926535
                8979323846
                2643383279
                3.141592653589793238462643383279
                3.1415926535897...
                ['3.1415926535\n', '8979323846\n', '2643383279']
                sdf mlkm h0oewi
                grw kok ewe 5y
                21334231

3. 异常

3.1 traceback

Python 使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果程序编写了处理异常的代码,程序会继续运行,如果对异常未处理,程序将停止,并显示 traceback,其中包含有关异常的报告。

print(5/0)

 输出:

Traceback (most recent call last):
  File "/Users/Python/main.py", line 26, in <module>
    print(5/0)
ZeroDivisionError: division by zero

3.2 try-except、else代码块

异常使用 try-except 代码块处理,try-except 代码块让 Python执行指定的操作,同时except 代码块将告诉Python发生异常时怎么办。使用了 try-except 代码块,即使出现了异常,程序也将继续运行。else 代码块依赖于try 代码块,当 try 代码块的成功执行后,将继续执行else代码块的内容

print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit ")

while True:
    first_num = input("\nFirst number: ")
    if first_num == 'q' :
        break

    second_num = input('Second_number: ')
    if second_num == 'q':
        break

    try:
        answer = int(first_num) / int(second_num)   # 只有可能引发异常的代码才需要放在 try 语句
    except ZeroDivisionError:
        print("You input second_numbers error.")    # try 代码块运算检测到异常为 ZeroDivisionError 才执行的代码
    except FileExistsError:
        print("No find the file.")      #try 代码块运算检测到异常为 FileExistsError 才执行的代码
    else:
        print(answer)       # try 代码块运算成功,才能执行的代码

 输出:

First number: 2
Second_number: 3
0.6666666666666666

First number: 4
Second_number: 0
You input second_numbers error

First number: q

try-except 代码块提供了两个重要的优点:避免让用户看到 traceback;让程序能够继续分析能够找到其他文件。

3.3 分析文本

.split() 函数按空格分割文件,并将这部分存储到一个列表中。下例是通过split来计算文件中有多少单词。

def count_word(filename):
    try:
        with open(filename) as f_obj:
            content = f_obj.read()
    except FileNotFoundError:       # t7.lua 文本没找到,将会执行 except内的代码
        msg = "The " + filename + "is not find."
        print(msg)
        #pass   #如果遭遇FileNotFoundError异常时,希望它不进行任何处理和反应,但又能够运行,可直接写pass
    else:
        words = content.split()
        num_words = len(words)
        print("The " + filename + " has about " + str(num_words) + " words.")

count_word('t6.lua')        #单个文本分割

filenames = ['t7.lua','t6.lua','device.txt']    ##多个文本分割
for filename in filenames:
    count_word(filename)

 pass 语句,可在代码块中使用它来让 Python 什么都不要做,它还充当了占位符,提醒你在程序的某个地方什么都没做,并且以后也许要在这里做些什么。

4. 存储数据

模块 json 能够将简单的 Python 数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。json 可以用在 Python 程序之间分享数据,但它并非Python专用,可以与使用其他编程语言的人分享。

注意:JSON 格式最初是为 JavaScript 开发的,但随后成为一种常见的格式,被包括 Python 在内的众多语言采用

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

函数 json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象。

函数 json.load() 加载存储在 文件中的信息

import json             # 1.先导入 json 模块

filename = 'UserString.json'   # 2. 通常使用扩展名 .json 来指出文件存储的数据为 JSON 格式

try:
     with open(filename) as f_obj:          # 5. 以读模式打开文件 numbers.json
        r_userstr = json.load(f_obj)        # 6. 加载文件 numbers.json 中的信息
except FileNotFoundError:
    w_userstr = input("please input user string: ")
    with open(filename,'w') as f_obj:       # 3. 以写模式打开文件 numbers.json
        json.dump(w_userstr,f_obj)          # 4. 将字符串列表存储到文件
        print("1. " + w_userstr)
else:
    print("2. " + r_userstr)

第一次运行时,没有找到 UserString.json 文件,执行 except语句,输入字符串,json.dump将字符串列表存储到文件。第二次运行时,已存在 UserString.json 文件,通过 json.load() 直接读取文件内容。

4.2 重构

代码能够正常运行,但可以做进一步改进--将代码划分为一系列完成具体工作的函数,这样的过程称为重构。重构让代码更清晰,更易于理解,更容易扩展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值