JSON 和 JSONL 的区别

一、JSON 和 JSONL 的区别

1. JSON 格式

  • 全称: JavaScript Object Notation

  • 结构: JSON 是一种树状嵌套结构,整个文件是一个完整的 JSON 对象。

  • 特点:

    1. 文件中通常只有一个 JSON 对象。
    2. 数据可以嵌套,例如对象中包含数组,数组中包含对象。
    3. 适用于需要表示复杂数据关系的场景。
  • 示例:

[
    {
        "id": 1,
        "name": "Alice",
        "age": 25
    },
    {
        "id": 2,
        "name": "Bob",
        "age": 30
    }
]

2. JSONL 格式

  • 全称: JSON Lines

  • 结构: JSONL 是一个轻量化的格式,每行表示一个独立的 JSON 对象。

  • 特点:

    1. 数据是逐行存储的,每行是一个完整的 JSON 对象。
    2. 文件中的每行可以独立解析,彼此没有嵌套关系。
    3. 适用于需要流式处理或者分布式处理的场景(如日志处理、数据批量加载)。
  • 示例:

{"id": 1, "name": "Alice", "age": 25}
{"id": 2, "name": "Bob", "age": 30}

主要区别

特性JSONJSONL
存储方式整体是一个完整的 JSON 对象每行是一个 JSON 对象
读取方式一次性读取整个文件可以逐行读取和解析
嵌套支持可以嵌套复杂结构每行独立,通常不嵌套
处理场景适合一次性加载的应用适合流式、分布式处理场景
文件大小影响文件越大,加载越慢可以按行加载,处理更高效

使用场景

  1. JSON:

    • 配置文件
    • 小规模数据存储
    • 描述复杂结构的层次化数据
  2. JSONL:

    • 大规模数据处理
    • 日志文件存储
    • 数据流应用(例如机器学习训练数据)

选择建议

  • 文件较小:优先使用 JSON,便于读取和管理。
  • 文件较大:优先使用 JSONL,可以逐行加载,避免内存占用过高。
  • 日志处理/分布式处理:使用 JSONL,每行可以独立处理,适合流式计算。

如果有具体的数据需求或处理场景,可以告诉我,我可以给出更针对性的建议!


3. JSON 和 JSONL 保存方法

# 保存为 json 格式文件
output_stats_file = 'data.jsonl'
with open(output_stats_file, 'w', encoding='utf-8') as outfile:
    json.dump(results, outfile, ensure_ascii=False, indent=2)
# 保存为 jsonl 格式文件
output_stats_file = 'data.jsonl'
with open(output_stats_file, 'w', encoding='utf-8') as outfile:
    for result in results:
        json.dump(result, outfile, ensure_ascii=False)
        outfile.write('\n')

二、加载文件方式

1. with open 加载

# 加载 JSON 文件
with open(data_path, 'r', encoding='utf-8') as f:
    data = json.load(f)

# 加载 JSONL 文件
with open(data_path, 'r', encoding='utf-8') as f:
    data = [json.loads(line.strip()) for line in f]

2. Hugging Face datasets 库加载

from datasets import load_dataset

# 加载 JSON 数据
dataset = load_dataset("json", data_files="path_to_your_file.json")

# 加载 JSONL 数据
dataset = load_dataset("json", data_files="path_to_your_file.jsonl")

# 加载多个 JSON 文件
data_files = {
    "train": "path_to_train.json",
    "test": "path_to_test.json",
}
dataset = load_dataset("json", data_files=data_files)

# dataset的其他用法
dataset = dataset.select(range(5))

# 训练集和验证集比例划分
train_ratio = 0.9
split_dataset = dataset.train_test_split(test_size = 1 - train_ratio)
train_dataset = split_dataset["train"]
eval_dataset = split_dataset["test"]

# 数据预处理函数: 将每个数据转化为 input_ids、labels、attention_mask
def tokenize_function(examples):
    return tokenizer(
        # examples["input"] + examples["output"],
        examples["input"]
        padding="max_length",
        truncation=True,
        max_length=max_seq_length,
    )

# tokenizer分词获取 input_ids、labels、attention_mask
train_dataset = train_dataset.map(tokenize_function, batched=True, remove_columns=["input", "output"])
eval_dataset = eval_dataset.map(tokenize_function, batched=True, remove_columns=["input", "output])

# 省略中间代码 ………………

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    data_collator=data_collator,
)

输出如下: 

Generating train split: 3 examples [00:00, 429.49 examples/s]
DatasetDict({
    train: Dataset({
        features: ['input', 'output'],
        num_rows: 3
    })
})

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用之间的数据传输。它由键值对构成,可以表示复杂的数据结构。JSON使用简单、易于阅读解析的结构,支持多种数据类型,包括字符串、数字、布尔值、数组对象。在Python中,可以使用json模块来处理JSON数据,包括将Python对象转换为JSON格式的字符串,以及将JSON格式的字符串转换为Python对象[^1]。 JSONLJSON Lines)是一种将多个JSON对象按行分隔存储的格式。每行都是一个独立的JSON对象,这种格式适用于处理大型数据集合,每个对象都可以独立地读取处理。与JSON相比,JSONL更适合处理大型数据集合,因为它可以逐行读取处理数据,而不需要一次性加载整个数据集合。在Python中,可以使用json模块来读取处理JSONL格式的数据。 以下是一个示例代码,演示了如何使用Python将数据保存为JSONJSONL格式的文件: ```python import json # 保存为JSON格式的文件 data = { "name": "John", "age": 30, "city": "New York" } with open("data.json", "w") as json_file: json.dump(data, json_file) # 保存为JSONL格式的文件 data_list = [ {"name": "John", "age": 30, "city": "New York"}, {"name": "Alice", "age": 25, "city": "London"}, {"name": "Bob", "age": 35, "city": "Paris"} ] with open("data.jsonl", "w") as jsonl_file: for item in data_list: json_file.write(json.dumps(item) + "\n") ` 以上代码将一个字典保存为JSON格式的文件,并将一个包含多个字典的列表保存为JSONL格式的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值