<
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

python数据文件操作

字数:3923 写于:2022-10-05
最新更新:2026-10-05 阅读本文预计花费您12分钟

CSV

CSV(Comma-Separated Values,逗号分隔值)是一种用于存储表格数据的纯文本文件格式。它用纯文本的形式,按行列结构组织数据,每行是一条记录,每列是一个字段,字段之间通常用逗号分隔

特点

  • 第一行通常为表头,如:姓名,年龄,城市,方便csv.DictReader()、excel程序读取,第一行也可能直接为数据(通过代码手动指定表头)
  • 默认使用逗号,分隔,也可自定义分隔符,如使用制表符(\t),分号(;)等
  • 如果字段本身包含分隔符、换行符,需要加引号,如:Alice,"Hello, world"
  • 拓展名通常为.csv,也可以为.tsv(制表符分隔)等
  • 所有数据都是文本,代码读取需要数值等类型需要手动转换类型
  • 文件编码方式不唯一,建议手动指定 UTF-8
  • 支持被 Excel 等导入,随便一个文本编辑器可打开,支持跨平台,但需要处理换行符:Windows用\r\n,Linux/Mac用\n
姓名,年龄,城市 张三,25,北京 李四,30,上海 王五,35,重庆

导入 csv 模块

Python 内置 csv 模块

import csv

读取CSV

读取为列表

csv.reader(fd...)返回一个可迭代对象,包含多个列表,每行数据为一个列表

  • fd:可以是任何支持迭代、且每次返回一个字符串的对象,如文件对象、列表
  • delimiter指定字段分隔符,默认为逗号','
  • quotechar指定默认使用的引号,默认为双引号""
  • quoting引号策略,常用值有:
    • csv.QUOTE_MINIMAL:仅在必要时加引号(默认)
    • csv.QUOTE_ALL:所有字段加引号
    • csv.QUOTE_NONNUMERIC:非数字字段加引号,读取时自动转 float
    • csv.QUOTE_NONE:不加引号
  • lineterminator指定行结束符,默认为'\r\n'
  • dialect:用于指定一套"方言",里面同时打包好了分隔符、引号规则、换行符等参数,方便快速切换,内置了3个值,excel(默认,逗号分隔,\r\n换行),excel-tab(制表符分隔TSV),unix(逗号分隔,\n换行)
import csv

with open('data.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)
#返回值为列表
['姓名', '年龄', '城市']
['张三', '25', '北京']
['李四', '30', '上海']
['王五', '35', '重庆']
读取为字典

csv.DictReader(fd....)返回可迭代对象,遍历结果为字典,通常以首行表头或fieldnames参数指定字段作为键,文件内容作为值

  • fd文件对象或可迭代对象
  • fieldnames = ['a','b'...]手动指定表头字段名序列,省略则用首行作字段名
  • restkey多余字段的键名
  • restval缺失字段的默认值,默认 None
  • dialect指定"方言",默认 'excel',参考上文
import csv

with open('data.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row)  
#输出字典 
{'姓名': '张三', '年龄': '25', '城市': '北京'}
{'姓名': '李四', '年龄': '30', '城市': '上海'}
{'姓名': '王五', '年龄': '35', '城市': '重庆'}

写入CSV

Windows下,通过 open() 打开文件并写入 csv 时,一定要指定 newline='',否则会在每行后多出一个空行,原因:

  • windows下 csv.writer() 会在写入每一行后添加行结束符'\r\n'
  • Windows下,用 open(..., 'w') 打开文件时,默认处于文本模式,会做换行符转换,写入文件时会自动把 '\n' 自动转换成 '\r\n'
  • 由此,最终行结束符会被写入为 '\r\r\n'
按列表写入

csv.writer(csvfile...)返回一个 writer 对象

  • csvfile任何有write()方法的对象,如文件对象
  • delimiter,quotechar,quoting指定字段分隔符,引号字符,引号策略,参考上文
  • lineterminator行结束符,默认'\r\n'
    DictWriter对象方法
  • writer.writerow(row)写入一行(row 为可迭代对象)
  • writer.writerows(rows)写入多行(rows 为行的可迭代对象)
data = [['姓名', '年龄', '城市'],
        ['张三', 25, '北京'],
        ['李四', 30, '上海']]

with open('output.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['姓名', '年龄', '城市'])   # 写一行
    writer.writerows(data)                      # 写多行
按字典写入

csv.DictWriter(f, fieldnames,...) 返回一个 writer 对象

  • f文件对象
  • fieldnames必填,字段名序列,决定写入顺序
  • restval缺失字段的默认值(默认 '')
  • extrasaction多余键的处理,'raise'(默认,抛 ValueError)或 'ignore'
  • dialect方言,默认'excel',参考上文
    DictWriter对象方法
  • writer.writeheader()写入表头,写入内容通过 fieldnames 参数指定
  • writer.writerow(rowdict)写入一行(字典)
  • writer.writerows(rowdicts)写入多行(字典的可迭代对象)
with open('output.csv', 'w', encoding='utf-8-sig', newline='') as f:
    fieldnames = ['姓名', '年龄', '城市']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()                                    # 写表头
    writer.writerow({'姓名': '张三', '年龄': 25, '城市': '北京'})
    writer.writerows([{'姓名': '李四', '年龄': 30, '城市': '上海'}])

json

json 标准库,用于处理 JSON 数据的编码(序列化)和解码(反序列化)

  • json.loads(text)JSON 字符串 → Python 对象
  • json.load(file)从文件对象读取 JSON → Python 对象
  • json.dumps(obj,ensure_ascii=False,indent=2)Python 对象 → JSON 字符串
    • 如果内容有中文,推荐将 ensure_ascii 改为 False,来直接输出中文,而不是类似于 \u4e2d\u6587
    • indent:格式化缩进,适合配置文件、调试和日志,如果用于网络传输等紧凑 JSON,则可以省略indent
  • json.dump(obj, file,ensure_ascii=False,indent=2)将 Python 对象写入 JSON 文件
# 将JSON 字符串转为 Python 对象
json_str = '{"name": "张三", "age": 25}'
data = json.loads(json_str)
print(data["name"]) # 通过键读取数据
# 从文件读取 → Python 对象
with open("data.json", "r", encoding="utf-8") as f:
    data = json.load(f)

# Python 对象 → JSON 字符串
data = {"name": "张三", "age": 25, "city": "北京"}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)  # {"name": "张三", "age": 25, "city": "北京"}
# Python 对象 → 写入文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
上一篇:playwright
下一篇:python爬虫库
z z z z z