3、数据获取基础:认识CSV、JSON、Excel等常见数据格式,使用Pandas读取本地文件

做数据可视化,第一步不是画图,而是把数据搞到手。

我见过不少新手,一上来就急着调matplotlib,结果数据读进来全是乱码,或者格式不对,折腾半天才发现是文件编码的问题。嗯,这种坑我自己也踩过不止一次。

今天我们就来聊聊,情绪数据最常见的几种存储格式,以及怎么用Pandas把它们乖乖读进Python里。

3.1 三种最常见的文件格式

情绪数据通常来自问卷、传感器、日志或者社交媒体。不同来源,格式也不同。我个人习惯先把数据摸清楚,再动手写代码。

CSV(逗号分隔值)

CSV 是最常见的格式,说白了就是一个纯文本表格。每一行是一条记录,每一列用逗号隔开。Excel 可以直接打开,记事本也能看。

举个例子,一份情绪调查数据可能是这样的:

user_id,emotion,score,timestamp
1001,happy,8.5,2024-01-15 10:30:00
1002,sad,3.2,2024-01-15 10:31:00
1003,angry,2.1,2024-01-15 10:32:00

优点:轻量、通用、几乎任何工具都能处理。
缺点:没有数据类型定义,所有字段都是字符串,需要自己转换。

我的小习惯:拿到 CSV 文件,先用记事本打开看一眼。看看分隔符到底是逗号、分号还是制表符。有些中文 CSV 文件用逗号,但内容里也有逗号,这时候就要小心了。

JSON(JavaScript对象表示法)

JSON 是结构化数据的王者。它用键值对的方式组织数据,特别适合嵌套结构。比如一条情绪记录可能包含多个维度的信息:

{
  "user_id": 1001,
  "emotion": "happy",
  "score": 8.5,
  "timestamp": "2024-01-15T10:30:00",
  "details": {
    "heart_rate": 72,
    "sleep_hours": 7.5,
    "notes": "今天心情不错"
  }
}

我在项目中遇到过,有些传感器数据直接输出 JSON 格式,一条记录里嵌套了十几个字段。用 Pandas 读取时,需要把嵌套结构展开,不然就是一坨乱麻。

Excel(.xlsx)

Excel 文件大家最熟悉。它支持多工作表、公式、颜色、合并单元格等花里胡哨的功能。但说实话,做数据分析时,这些花哨功能反而是麻烦。

曾经踩过的坑:有一次我拿到一份 Excel 文件,里面居然有合并单元格、空行、还有批注。Pandas 读进来直接崩了。后来我学乖了——先让业务方导出一份纯数据的 CSV,省心多了。

3.2 用Pandas读取本地文件

Pandas 是 Python 数据分析的瑞士军刀。读取文件就三行代码的事,但细节决定成败。

读取CSV

import pandas as pd

# 最基础的读取
df = pd.read_csv('emotion_data.csv')

# 如果文件有中文,指定编码
df = pd.read_csv('emotion_data.csv', encoding='utf-8')

# 如果分隔符是制表符
df = pd.read_csv('emotion_data.tsv', sep='\t')

# 只看前5行,快速预览
df = pd.read_csv('emotion_data.csv', nrows=5)

你想想看,为什么有时候读出来全是乱码?因为文件保存时用的是 GBK 编码,而你用 UTF-8 去读。解决办法就是指定正确的编码参数。

读取JSON

# 读取标准JSON
df = pd.read_json('emotion_data.json')

# 如果JSON是嵌套的,需要指定路径
df = pd.read_json('emotion_data.json', orient='records')

# 处理嵌套字段,用json_normalize展开
from pandas import json_normalize
import json

with open('emotion_data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

df = json_normalize(data)

这里要注意,json_normalize 会把嵌套的键用点号连接起来,比如 details.heart_rate。这样展开后,每个字段都变成一列,方便后续分析。

读取Excel

# 读取第一个工作表
df = pd.read_excel('emotion_data.xlsx')

# 指定工作表名称
df = pd.read_excel('emotion_data.xlsx', sheet_name='Sheet1')

# 跳过前两行(有些Excel文件有标题行)
df = pd.read_excel('emotion_data.xlsx', skiprows=2)

# 只读取特定列
df = pd.read_excel('emotion_data.xlsx', usecols=['user_id', 'emotion', 'score'])
核心要点:读取 Excel 时,记得安装 openpyxl 或 xlrd 库。Pandas 只是接口,底层需要这些引擎来解析文件。

3.3 数据读取后的第一件事

文件读进来了,别急着分析。先做三件事:

  1. 看形状:df.shape 看看多少行多少列
  2. 看字段:df.columns 看看有哪些列
  3. 看数据类型:df.dtypes 看看每列是不是你想要的类型

我曾经接手过一个项目,读进来发现“score”列是字符串类型,因为原始数据里混了一个“N/A”。如果不检查类型,后面做数学运算直接报错。

3.4 知识体系一览

下面这张图,帮你理清本章的核心逻辑:

数据获取基础:知识体系 数据文件读取 CSV格式 read_csv() 编码问题(utf-8/gbk) 分隔符参数 sep JSON格式 read_json() json_normalize() 展开嵌套 orient 参数 Excel格式 read_excel() sheet_name 参数 skiprows / usecols 检查:shape → columns → dtypes

3.5 避坑指南

最后,分享几个我踩过的坑,你遇到了能少走弯路:

  • 文件路径别用中文:Windows 下中文路径经常出幺蛾子,建议项目目录全英文。
  • 大文件别一次性读:如果 CSV 文件超过 1GB,用 chunksize 参数分块读取,不然内存直接爆掉。
  • Excel 里的日期格式:Pandas 读 Excel 日期时,有时候会变成数字(比如 44205 代表 2021-01-01)。用 parse_dates 参数指定列名,让它自动转换。
  • JSON 文件太大怎么办:pd.read_json()lines=True 参数,按行读取 JSON 文件,每行一个 JSON 对象。这种格式叫 JSON Lines,处理大数据时很实用。
一句话总结:数据读取是基本功,别嫌麻烦。花 5 分钟检查数据格式,能省下后面 2 小时的调试时间。

公众号:蓝海资料掘金营,微信deep3321