0Pricing
Pandas & NumPy Academy · 课时

读取 Excel 与 JSON 文件

使用 pd.read_excel 导入 Excel 工作簿,使用 pd.read_json 导入 JSON 记录,并处理常见的格式差异。

读取 Excel 与 JSON 文件 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

Excel 和 JSON 为什么重要

CSV 虽然是通用格式,但 Excel 文件(.xlsx/.xls)是通过电子邮件和报告工具共享的业务数据的主流格式。JSON 是 REST API 和 NoSQL 数据库的原生格式。Pandas 提供了 pd.read_excel() 和 pd.read_json(),其接口与 CSV 读取函数相似,因此相关技能可以直接迁移。

import pandas as pd

# The three most common load functions share the same philosophy
df_csv   = pd.read_csv('data.csv')
df_excel = pd.read_excel('data.xlsx')
df_json  = pd.read_json('data.json')

安装 Excel 引擎

读取 Excel 文件需要使用引擎:openpyxl 用于 .xlsx 文件(现代格式),xlrd 用于较旧的 .xls 文件。请使用 pip install openpyxl 进行安装。Pandas 会根据文件扩展名自动选择引擎。写入文件时,可以使用 xlsxwriter 实现高级格式设置。如果未安装引擎,read_excel() 会引发 ModuleNotFoundError。

# Install the required engine:
# pip install openpyxl          # for .xlsx (modern)
# pip install xlrd==1.2.0       # for .xls (legacy)

import pandas as pd
df = pd.read_excel('report.xlsx', engine='openpyxl')

使用 sheet_name 选择工作表

Excel 工作簿可以包含多个工作表。sheet_name= 用于指定要读取的工作表:可以传入字符串(工作表名称)、整数(从 0 开始的位置),或列表以将多个工作表读取为字典。传入 sheet_name=None 可将所有工作表读取为以工作表名称为键的字典。使用 pd.ExcelFile('file.xlsx').sheet_names 查看可用工作表是一个很好的起点。

import pandas as pd

# Read the second sheet
df = pd.read_excel('workbook.xlsx', sheet_name=1)

# Read by name
df = pd.read_excel('workbook.xlsx', sheet_name='Sales')

# Inspect available sheets
xl = pd.ExcelFile('workbook.xlsx')
print(xl.sheet_names)  # ['Summary', 'Sales', 'Costs']

常见的 Excel 参数

pd.read_excel() 支持大多数与 read_csv() 相同的参数:header=、index_col=、usecols=、skiprows=、dtype= 和 nrows=。对于 Excel,usecols 还接受类似 'A:C' 或 'A,C,E' 的 Excel 列范围字符串;如果您知道电子表格布局中的列字母,这会非常方便。

import pandas as pd

df = pd.read_excel(
    'sales_report.xlsx',
    sheet_name='Q1',
    header=2,          # header is on row 3 (0-indexed)
    usecols='A:D',     # Excel column range
    skiprows=[3, 4],   # skip rows 4 and 5
    nrows=100
)

读取 JSON:orient 格式

pd.read_json() 会将 JSON 读取为 DataFrame。orient= 参数用于指定 JSON 结构:'records'(行字典列表)、'columns'(列数组字典,默认值)、'index'(以索引为键的行字典),或 'values'(原始数组)。大多数 REST API 返回 'records' 格式——请始终先检查原始 JSON,以确定正确的 orient。

import pandas as pd

# REST API response: list of records
json_str = '[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]'
df = pd.read_json(json_str, orient='records')
print(df)

从文件或 URL 读取 JSON

pd.read_json() 接受文件路径、URL 或直接传入 JSON 字符串。对于深层嵌套的 JSON(例如包含嵌套对象的 API 响应),请改用 pandas.io.json 模块中的 json_normalize(),它会将嵌套字典展平为列,并使用以点分隔的名称。

import pandas as pd
from pandas.io.json import json_normalize

# From a file
df = pd.read_json('events.json')

# Flatten nested JSON
nested = [{'id': 1, 'user': {'name': 'A', 'age': 30}},
          {'id': 2, 'user': {'name': 'B', 'age': 25}}]
df_flat = json_normalize(nested)
print(df_flat.columns.tolist())  # ['id', 'user.name', 'user.age']

JSON Lines 格式

JSON Lines(NDJSON)每行存储一个 JSON 对象,因此便于流式处理大型数据集。使用 pd.read_json('file.jsonl', lines=True) 可解析此格式。它常见于日志文件、Kafka 导出数据和机器学习数据集格式中。每一行都必须是有效的 JSON 对象;格式错误的行会导致读取失败。

import pandas as pd

# file.jsonl contains one JSON record per line:
# {"id": 1, "event": "click"}
# {"id": 2, "event": "view"}
df = pd.read_json('events.jsonl', lines=True)
print(df)

处理 JSON 中的日期解析

JSON 没有原生的日期类型——日期会以字符串或 Unix 时间戳(自纪元以来的毫秒数或秒数)存储。设置 convert_dates=True(默认值),让 Pandas 尝试自动转换列名中包含 'date'、'time' 或 'at' 的列。对于自定义列名或时间戳,请使用 pd.to_datetime(df['col'], unit='ms') 显式转换。

import pandas as pd

# Unix milliseconds timestamp column
df = pd.read_json('events.json', orient='records')
df['created_at'] = pd.to_datetime(df['created_at'], unit='ms')
print(df['created_at'].dtype)  # datetime64[ns]

比较 Excel 和 JSON 的常见陷阱

Excel 的常见陷阱:合并单元格会产生 NaN 行,隐藏的行或列仍会包含在输出中,而数字格式(例如以浮点数存储的日期)必须在加载后修正。JSON 的常见陷阱:不同记录中字段存在情况不一致会产生 NaN,而 JSON 对象中的整数键会变成字符串列名。

import pandas as pd

# Excel date stored as float (Excel serial date)
df = pd.read_excel('old_report.xls')
# If dates appear as floats (e.g., 44927.0), convert:
# from xlrd import xldate_as_datetime
# df['date'] = df['date'].apply(lambda x: xldate_as_datetime(x, 0))

使用 pd.ExcelFile 处理多个工作表

如果需要高效地从同一个文件中读取多个工作表,请打开一个 pd.ExcelFile 上下文管理器,并针对每个工作表调用 parse(sheet_name)。这样可以避免针对每个工作表重复打开和解析文件,这对于大型工作簿非常重要。上下文管理器退出时会自动关闭文件句柄。

import pandas as pd

with pd.ExcelFile('annual_report.xlsx') as xf:
    df_q1 = xf.parse('Q1')
    df_q2 = xf.parse('Q2')

print(df_q1.shape, df_q2.shape)

使用 requests 加载 JSON API

对于 REST API 数据,请使用 requests 库获取 JSON,再将解析后的 Python 对象传递给 pd.DataFrame() 或 pd.json_normalize()。这种模式将 HTTP 处理与数据解析分离开来,使您可以在 Pandas 处理数据之前访问请求头、身份验证和分页信息。

import pandas as pd
import requests

response = requests.get('https://api.example.com/records')
data = response.json()   # Python list of dicts
df = pd.DataFrame(data)
print(df.head())

快速检查

通过本课内容检验您对使用 Pandas 读取 Excel 和 JSON 文件的理解。

课程回顾

本课您学习了:pd.read_excel() 可以读取 xlsx 文件,并通过 sheet_name 指定要加载的工作表;pd.read_json() 可以处理由 orient 参数控制的多种 JSON 结构;以及 json_normalize() 可以将嵌套的 JSON 对象展平为扁平的 DataFrame。接下来,我们将把 DataFrames 导出为 CSV 和 Excel 文件,以便共享和进行后续处理。

常见问题解答

「读取 Excel 与 JSON 文件」课时是免费的吗?

是的 — 「读取 Excel 与 JSON 文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「读取 Excel 与 JSON 文件」这节课中我会学到什么?

使用 pd.read_excel 导入 Excel 工作簿,使用 pd.read_json 导入 JSON 记录,并处理常见的格式差异。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「读取 Excel 与 JSON 文件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 读取 CSV 文件
  2. 读取 Excel 与 JSON 文件
  3. 将 DataFrames 写入文件
  4. 从 URL 与 StringIO 读取
← 返回 Pandas & NumPy Academy