python-文件操作

学习目标

  1. 掌握使用 read,write 读写文本文件;

  2. 掌握读取 json 文件内容;

第 1 章 文件操作------基本操作

一、⽂件操作流程

1. 操作⽂件的套路

  • 打开⽂件---open函数
  • 读、写⽂件
    • 读: 将⽂件内容读⼊内存----read
    • 写: 将内容写⼊⽂件---write
  • 关闭⽂件---close

2. 操作⽂件的函数/⽅法

在 Python 中要操作⽂件需要记住 1 个函数和 3 个方法

3. 读取第一个文件内容案例

打开文件:

  • file=open(r"要打开文件的路径和文件名","r")

  • file是一个变量名,代表文件操作对象

  • 避免文件路径转义,加上"r" 第二个r表示只读方式打开文件

读取文件内容:

  • txt=file.read()
  • txt是定义一个变量,代表存放读取到的文件内容
  • file是上一个open返回的文件操作对象
  • read()是file对象的一个方法,用来读取文件内容

关闭文件:

  • file.close()
  • file是上一个open返回的文件操作对象
  • 文件打开后,一定要关闭文件
  • close()是file对象的一个方法,用来关闭文件内容
#打开文件
file=open(r"./data.csv","r")   #第一个r是防止转义,第二个r表示只读属性

#读取文件
txt=file.read()
print(txt)

#关闭文件
file.close() 

hello,python


Process finished with exit code 0

4. 写入第一个文件案例

打开文件:

  • file=open(r"要打开文件的路径和文件名","w")

  • 第二个参数w代表用写的方式打开文件

  • 如果用w方式打开文件,文件名不存在,会创建一个新文件,存在的话会覆盖已有文件

  • ”a“表示追加写入,”w“表示覆盖写入

写文件:

  • file.write(要写入的内容)

关闭文件:

  • file.close()
#打开文件
file=open(r"./data2.csv","w")

#写内容
file.write("hello python")

#关闭文件
file.close()

验证是否写入成功:

二、open 打开⽂件的⽅式

open 函数默认以只读⽅式打开⽂件,并且返回⽂件对象

“r”:只读方式打开文件; (文件必须存在)

“w”:只写方式打开文件;

“a”:追加写方式打开文件;

open 函数的访问方式后面添加 b 参数代表访问二进制文件,如:

rb : 代表用只读的方式打开一个二进制文件;

wb:代表用只写的方式打开一个二进制文件。

ab:代表用追加写的方式打开一个二进制文件

三、open 打开文件时指定字符集

open(文件名, 打开方式, encoding=’字符集’)

1. utf8 编码格式打开文件

如果指定文件字符集编码不是 utf8,open打开会报错(文件中有中文,打开会报错,加上encoding="utf8")

#打开文件
file=open(r"./data.csv","r",encoding="utf8")   

#读取文件
txt=file.read()
print(txt)

#关闭文件
file.close()

2. gbk 编码格式打开文件

如果指定文件字符集编码不是 gbk,打开会报错

#打开文件
file=open(r"./data.csv","r",encoding="gbk")

#读取文件
txt=file.read()
print(txt)

#关闭文件
file.close()

第 2 章 文件操作------按行读取文件内容

一、readline ⽅

readline 方法可以一次读取一行内容

⽅法执⾏后,会把⽂件指针移动到下⼀⾏,准备再次读取

readline 方法读取到文件最后,返回长度为 0 的字符串

二、readline读取文件一行内容

file=open(r"./data.csv","r")
txt=file.readline()
print(txt)
file.close()

hello,python

Process finished with exit code 0

三、结合 while 循环 readline 读取文件全部内容

file=open(r"./data.csv","r")
#在循环开始的时候,不知道文件有多少行,,所以也不能觉得循环多少次
while True:
    txt=file.readline()
    #如果readline读取到文件最后末尾,返回 “ ”
    if txt =="":
        break
    print(txt,end="")

file.close()

hello,python
1,11
22,222
33,333

Process finished with exit code 0

四、readlines ⽅

  • readlines 方法可以一次读取文件所有行,返回类型为列表。
file=open(r"./data.csv","r")
# text 类型为 list,list 中每个成员就是文件 data.txt 的每一行
text = file.readlines()

# 遍历列表 text
for n in text:
    # 显示 text 每个成员内容
    print(n)

# 关闭文件
file.close()


hello,python
1,11
22,222
33,333

Process finished with exit code 0

五、with open 语法(重点)

  • 这个语法不需要调用colse关闭文件
file=open(r"./data.csv","r")
text=file.read()
print(text)
file.close()

以上代码等价:

with open("./data.csv","r") as f:
    text = f.read()
    print(text)

第 3 章 JSON 操作

一、JSON 介绍

  • JSON 的全称是”JavaScript Object Notation”,是 JavaScript 对象表示法,它是一 种基于文本,独立 于语言的轻量级数据交换格式。

二、JSON 特点

  • JSON 是纯文本
  • JSON 具有良好的自我描述性,便于阅读和编写
  • JSON 具有清晰的层级结构
  • 有效地提升网络传输效率

三、JSON 语法规则

  • 大括号保存对象
  • 中括号保存数组
  • 对象数组可以相互嵌套;
  • 数据采用键值对表示;
  • 多个数据由逗号分隔;

四、JSON

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null

五、JSON 文件读写

1.读取 JSON 文件:

创建data.json文件

{
  "name":"tom",
  "age": 20,
  "addr": [1,2,3],
  "qw": {"sex": "男"}
}

读取json文件:

import json

file=open("data.json","r",encoding="utf8")
data=json.load(file)
# 返回的 data 数据类型为字典或列表
print(data)

file.close()

{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}

Process finished with exit code 0

思考:data=json.load(file)----解释什么时候 返回的 data 数据类型为字典或列表?

  • 看json文件的数据是列表还是字典

1.返回的是列表格式--json文件要写在列表里

[{
  "name":"tom",
  "age": 20,
  "addr": [1,2,3],
  "qw": {"sex": "男"}
  }
]
  • 此时返回的是列表
[{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}]

Process finished with exit code 0

2.返回的是字典格式---json文件要写在字典里

{
  "name":"tom",
  "age": 20,
  "addr": [1,2,3],
  "qw": {"sex": "男"}
}
  • 此时返回的是字典
{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}

Process finished with exit code 0

2.写入 JSON 文件:

data = {'name': 'tom', 'age': 20, 'country': '中国'}
f = open('./temp.json', 'w', encoding='UTF-8')
json.dump(data, f, ensure_ascii=False)
f.close()

3. 课堂练习 --修改json文件内容(理解)

1.文件 data.json 内容如下:

{
  "name":"tom",
  "age": 20,
  "addr": [1,2,3],
  "qw": {"sex": "男"}
}

2.利用 json.load 与 json.dump 将 age 的值修改为 30

#思路:
# 先把内容从data.json文件中读取出来
# 读出来的结果是一个字典
# 把字典中键age对应的值修改30
# 再把字典写回到data.json文件中
file =open("data.json","r",encoding="utf8")
dict1=json.load(file)
file.close()

dict1["age"]=30

file=open("data.json","w",encoding="utf8")
json.dump(dict1,file,ensure_ascii=False)
file.close()

结果:

{"name": "tom", "age": 30, "addr": [1, 2, 3], "qw": {"sex": "男"}}

重点:

1,编写读取json文件函数 (list)

  • 构建temp.json文件数据---json数据写在列表里
[
  {
    "desc": "case001 登录成功",
    "login_data": {"mobile": "13800000002","password": "123456"},
    "status_code": 200,
    "success": true,
    "code": 10000,
    "message": "操作成功"
  },
  {
    "desc": "case002 不输入手机号",
    "login_data": {"mobile": "", "password": "123456"},
    "status_code": 200,
    "success": false,
    "code": 20001,
    "message": "用户名或密码错误"
  }
]
  • 编写函数脚本
import json

def build_data():
    test_data=[]
    # 指定文件路径
    json_file="./temp.json"
    # 打开json文件
    with open(json_file,encoding="utf-8") as f:
        # 将json文件转化为字典
        jsondict_data = json.load(f)
        for case_data in jsondict_data:
            login_data =case_data.get("login_data")
            status_code = case_data.get("status_code")
            success = case_data.get("success")
            code = case_data.get("code")
            message = case_data.get("message")
            test_data.append((login_data,status_code,success,code,message))

        print(test_data)
    return test_data

build_data()

打印结果:

[({'mobile': '13800000002', 'password': '123456'}, 200, True, 10000, '操作成功'), ({'mobile': '', 'password': '123456'}, 200, False, 20001, '用户名或密码错误')]

Process finished with exit code 0

1,编写读取json文件函数 (dict)

  • 构建temp.json文件数据---json数据写在字典里
{
  "case001 登录成功":
  {
    "login_data": {"mobile": "13800000002", "password": "123456"},
    "status_code": 200,
    "success": true,
    "code": 10000,
    "message": "操作成功"
  },
  "case002 不输入手机号":
  {
    "login_data": {"mobile": "", "password": "123456"},
    "status_code": 200,
    "success": false,
    "code": 20001,
    "message": "用户名或密码错误"
  }
}
import json

def build_data():
    test_data={}
    # 指定文件路径
    json_file="./temp.json"
    # 打开json文件
    with open(json_file,encoding="utf-8") as f:
        # 将json文件转化为字典
        jsondict_data = json.load(f)
        for i in jsondict_data:
            test_data[i]=jsondict_data[i]
            #print(test_data)
            print(i,test_data[i])
            print(i,test_data[i]["login_data"])

    return test_data

build_data()
case001 登录成功 {'login_data': {'mobile': '13800000002', 'password': '123456'}, 'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}
case001 登录成功 {'mobile': '13800000002', 'password': '123456'}

case002 不输入手机号 {'login_data': {'mobile': '', 'password': '123456'}, 'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}
case002 不输入手机号 {'mobile': '', 'password': '123456'}

Process finished with exit code 0

2,编写读取CSV文件函数

异常包模块:

第 1 章 其他------异常

一、 异常的概念

  • 程序在运⾏时,如果遇到到⼀个错误,会停⽌程序的执⾏,并且提示⼀些错误信息,这就是异常

  • 程序停⽌执⾏并且提示错误信息这个动作,称之为:抛出(raise)异常

  • 程序开发时,很难将所有的特殊情况都处理的⾯⾯俱到,通过异常捕获 可 以针对突发事件做集中的处理,从⽽保证程序的稳定性和健壮性

二、捕获异常

1. 简单的捕获异常语法

在程序开发中,如果对某些代码的执⾏不能确定是否正确,可以增加 try(尝 试) 来捕获异常

  • 语法格式:
try:
    可能出现异常的代码 
except: 
    出现异常的处理代码
    
如果try下面的代码没出现异常,那么except下面的代码不会执行
只有try下面的代码出现异常,except下面的代码才会执行
一旦异常被try捕捉,那么程序就不会报错终止
  • 演练 —— 要求⽤户输⼊整数
try:
    num1 = int(input("请输入数字:"))
except:
    print("请输入正确的数字")
    
请输入数字:3
Process finished with exit code 0

请输入数字:qwe
请输入正确的数字
Process finished with exit code 0

2. 捕获不同类型异常

  • 在程序执⾏时,可能会遇到不同类型的异常,并且需要针对不同类型的异常, 做出不同的响应,这个时候,就需要捕获错误类型了。

演练---⽤户输⼊两个整数,显示两个整数相除后的结果

try:
    a = int(input("请输入数字:"))
    b = int(input("请输入数字:"))
    print(a/b)
except ValueError:
    print("请输入一个可以转换的数字")
except ZeroDivisionError:
    print("除数不能为0")
except:
    print("未知错误")

#ValueError :输入的值不能转换为整数
#ZeroDivisionError:除数不能为0

请输入数字:0
请输入数字:0
除数不能为0
Process finished with exit code 0

请输入数字:qwe
请输入一个可以转换的数字
Process finished with exit code 0

3. 捕获未知错误

在开发时,要预判到所有可能出现的错误,还是有⼀定难度的

如果希望程序⽆论出现任何错误,都不会因为 程序抛出异常⽽被终⽌,可 以再增加⼀个 except

  • 语法格式
try:
    可能出现异常的代码 
except Exception as result: 
    出现未知异常的处理代码
  • 演练 —— 两个变量,一个为整数,一个为字符串,显示两个变量相加的结果
try:
    a="aaaa"
    b=6
    print(a + b)
except Exception as result:
    print(result)
    
can only concatenate str (not "int") to str

Process finished with exit code 0

4. 没有异常发生才执行的代码

程序运行过程中,如果没有异常发生,需要执行一段代码。这个时候可以使用 else。

  • 语法格式
try:
    可能出现异常的代码 
except Exception as result: 
    出现未知异常的处理代码 
else:
    没有异常执行的代码
  • 演练 —— ⽤户输⼊两个整数,显示两个整数相除后的结果
try:
    a = int(input("请输入数字:"))
    b = int(input("请输入数字:"))
    print(a/b)
except Exception as result:
    print("未知错误{}".format(result))
else:
    print("恭喜,没有异常发生")
请输入数字:2
请输入数字:1
2.0
恭喜,没有异常发生

Process finished with exit code 0
请输入数字:awe
未知错误invalid literal for int() with base 10: 'awe'

Process finished with exit code 0

5. 无论是否有异常,都要执行的代码

程序运行过程中,一旦发生异常,代码就会跳转到 except,有时需要不论发 生任何异常,都必须要执行一段代码。这个时候可以使用 finnly

  • 语法格式
try:
    可能出现异常的代码 
except Exception as result: 
    出现未知异常的处理代码 
finally: 
    无论是否有异常都要执行的代码
  • 演练 —— ⽤户输⼊两个整数,显示两个整数相除后的结果
try:
    a = int(input("请输入数字:"))
    b = int(input("请输入数字:"))
    print(a/b)
except Exception as result:
    print("未知错误{}".format(result))
finally:
    print("无论有无异常,都要执行")
请输入数字:2
请输入数字:1
2.0
无论有无异常,都要执行

Process finished with exit code 0
请输入数字:2
请输入数字:0
未知错误division by zero
无论有无异常,都要执行

Process finished with exit code 0

三、抛出异常

  • 在开发中,除了代码执⾏出错时被动抛出异常之外, 还可以根据应⽤程序 特有的业务需求主动抛出异常。
  • 抛出异常使用 raise 关键字,同时 Python 中提供了⼀个 Exception 异常类

主动抛出异常语法:

raise Exception(“异常描述”)

演练------提示⽤户输⼊密码,如果⻓度少于 8,抛出异常

str1 = input("请输入密码")
if len(str1) < 8:
    raise Exception("密码长度不够")
else:
    print("密码正确")
    
请输入密码12
Traceback (most recent call last):
  File "D:\PycharmProjects\111\222\002.py", line 23, in <module>
    raise Exception("密码长度不够")
Exception: 密码长度不够

Process finished with exit code 1

注意

如果通过 raise 抛出异常,但程序中没有使用 try 捕捉异常,程序会终止,所以完整

代码如下:

try:
    str1 = input("请输入密码")
    if len(str1) < 8:
        raise Exception("密码长度不够")
    else:
        print("密码正确")
except Exception as result:
    print(result)
    
请输入密码asd 
密码长度不够

Process finished with exit code 0
posted @   mike002  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示