python基础库-json模块和文件处理

文件处理

处理文件的几种模式

在Python中,open() 函数可以接受一个参数来指定文件的打开模式。以下是一些常见的文件处理模式:

    "r":读取模式(默认)。在这种模式下,文件只能被读取,如果文件不存在则会引发异常。

    "w":写入模式。在这种模式下,如果文件存在,会被覆盖;如果文件不存在,则会创建一个新文件。

    "a":追加模式。在这种模式下,文件如果存在,则写入的内容会被追加到文件末尾;如果文件不存在,则会创建一个新文件进行写入。

    "b":二进制模式。在这种模式下,文件将以二进制模式进行操作,适用于非文本文件(如图片、视频等)的读写。

    "r+":读写模式。在这种模式下,文件可以同时被读取和写入。

    "w+":读写模式。在这种模式下,文件可以被读取和写入,如果文件存在,则会被覆盖;如果文件不存在,则会创建一个新文件。

    "a+":读写模式。在这种模式下,文件可以被读取和写入,写入的内容会被追加到文件末尾;如果文件不存在,则会创建一个新文件。如果想读到内容,先要把文件指针移动到最前面,即seek(0),既想读又想写就用seek和a+

这些模式可以根据需要进行组合,例如"rb"表示以二进制模式读取文件。在使用 open() 函数打开文件时,可以通过传入第二个参数来指定文件的打开模式。例如:

with open('example.txt', 'r') as file:
    # 读取文件内容
    content = file.read()

文件指针

# 既想读又想写,就用文件指针
with open('test.json','a+',encoding='utf-8') as f:
    # 移动文件指针,因为文件指针默认在最后,如果不挪动指针位置,是读不到东西的,这里就填0就ok,证明挪到最前面,不是按照下标走的,输别的数字会报错
    f.seek(0)
    for line in f:
        print(line.strip())

读文件

# 一次性获取文件内容
with open('test.html',encoding='utf-8') as fr:
    print(fr.read())

# 逐行读取文件内容--方式1
# 这种方法会逐行迭代文件对象,每次迭代会返回文件中的一行内容作为字符串。这种方式适合处理大文件,因为它一次只读取一行内容到内存中,不会一次性将整个文件加载到内存中。
with open('test.json',encoding='utf-8') as fr1:
    for num,line in enumerate(fr1):
        print(num,line)

# 逐行读取文件内容--方式2
# 这种方法会一次性将文件的所有内容读取到内存中,并将每一行作为一个字符串存储在列表中。然后你可以通过遍历这个列表来逐行处理文件内容。这种方式适合文件不是很大的情况。
with open('test.json',encoding='utf-8') as fr2:
    lines = fr2.readlines()
    for num,line in enumerate(lines):
        print(num,line)

写文件

with open('test.json','w',encoding='utf-8') as f:
    f.write('test') # 可以写入字符串
    f.writelines(["Line 1\n", "Line 2\n", "Line 3\n"]) # 可以写入一个字符串列表

说明

因为文件不支持写入除了字符串以外的数据(比如数字、列表、字典等),所以需要将字典或list转成字符串的格式,在写入到文件

将非字符串类型的数据转换为字符串

# 数值转换为字符串
number = 42
string_number = str(number)

# 字典转换为JSON字符串
import json
data = {"key": "value"}
json_string = json.dumps(data)

# 对象序列化为字节字符串
import pickle
obj = {"key": "value"}
pickle_string = pickle.dumps(obj)

json

json就是一个字符串,json必须是双引号,不能是单引号。

字典和字符串互相转换

方式1--json.dumps,json.loads

# 先定义一个字典
d = {
    "error":2,
    "msg":"无结果" # 会将中文转换成unicode格式存储,如"\u65e0\u7ed3\u679c"
}

# 把字典写到文件中
with open('aa.json','w',encoding='utf-8') as fw:
    # fw.write(d) # 报错argument must be str, not dict(参数必须是str,而不是dict)
    s = json.dumps(d,ensure_ascii=False,indent=4) # 将字典转换成字符串(只要是文件中的,全都是字符串。文件只支持字符串)
    fw.write(s) # 此时即可以写入到文件了

# 把文件中的数据读出来
with open('aa.txt',encoding='utf-8') as fr:
    result = fr.read()
    dic = json.loads(result) # 将字符串转换成字典
    print('刚从文件中读出来的',result)
    print('转换之后的',dic)

# 问题:
# 1,写入到文件中时,会将中文转换成unicode格式存储,如"\u65e0\u7ed3\u679c";
# 2,写到文件中,不会换行,不美观,如{'error': 2, 'msg': '无结果'}
# 3,文件中的数据不带颜色
# 解决方式:
# 1,在dumps写入时加上参数ensure_ascii=False即可,如s = json.dumps(d,ensure_ascii=False)
# 2,在dumps写入时加上参数indent=4,可以解决没关的问题
# 3,在创建文件时将.txt改为.josn即可,如open('aa.json','w',encoding='utf-8')

方式2--json.dump,json.load

# 字典转字符串,和字符串转字典,各自分别还有一种写法,这两种方法不需要自己手动的读和写
# 字典转字符串:dump,字符串转字典:load 例:

c = {
        "error_code": 0,
        "stu_info": [
            {
                "id": 314,
                "name": "矿泉水",
                "sex": "男",
                "age": 18,
                "addr": "北京市昌平区",
                "grade": "摩羯座",
                "phone": "18317155663",
                "gold": 100
            },
            {
                "id": 315,
                "name": "矿泉水",
                "sex": "女",
                "age": 27,
                "addr": "上海",
                "grade": "摩羯座",
                "phone": "18317155664",
                "gold": 100
            }
        ]
    }
with open('cc.json','w',encoding='utf-8') as fw:
    # d是需要操作的字典,fw是需要操作的文件,就直接写进文件中了,不需要自己在wirte一次了
    json.dump(c,fw,ensure_ascii=False,indent=4)

with open('cc.json',encoding='utf-8') as fr:
    # 直接传文件名即可,也不需要自己在read一次了
    result = json.load(fr) 
    print(result)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值