如何用Python读写JSON/CSV/Excel文件?

紅蓮之龍
发布: 2025-09-06 14:51:01
原创
237人浏览过
Python处理JSON、CSV和Excel文件需根据数据格式特性和需求选择合适库:JSON用内置json模块实现序列化与反序列化;CSV可用csv模块或pandas进行读写,后者更适用于表格数据操作;Excel文件通常用pandas(结合openpyxl引擎)高效处理多工作表和复杂结构,或用openpyxl进行精细单元格控制。

如何用python读写json/csv/excel文件?

Python处理JSON、CSV和Excel文件,核心在于理解这些数据格式的结构特性,并选择合适的库进行数据的序列化(Python对象转文件格式)与反序列化(文件格式转Python对象)。对于JSON和CSV,Python提供了内置的

json
登录后复制
csv
登录后复制
模块;而对于Excel,通常我们会依赖强大的第三方库如
pandas
登录后复制
openpyxl
登录后复制
来高效且灵活地完成读写操作。选择哪个工具,往往取决于你的具体需求:是简单的数据交换,还是复杂的数据分析与处理。

解决方案

JSON文件读写

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。Python的

json
登录后复制
模块是处理JSON的标配。

  • 读取JSON文件:

    立即学习Python免费学习笔记(深入)”;

    import json
    
    # 假设有一个名为'data.json'的文件
    # 内容可能像这样:{"name": "Alice", "age": 30, "isStudent": false, "courses": ["Math", "Physics"]}
    try:
        with open('data.json', 'r', encoding='utf-8') as f:
            data = json.load(f) # 从文件中加载JSON数据
        print("从JSON文件读取的数据:", data)
        print("Alice的年龄是:", data['age'])
    except FileNotFoundError:
        print("data.json 文件未找到。")
    except json.JSONDecodeError:
        print("data.json 文件格式不正确。")
    
    # 如果是JSON字符串,而不是文件
    json_string = '{"city": "New York", "population": 8000000}'
    data_from_string = json.loads(json_string) # 从字符串加载JSON数据
    print("从JSON字符串读取的数据:", data_from_string)
    登录后复制
  • 写入JSON文件:

    import json
    
    new_data = {
        "name": "Bob",
        "age": 25,
        "isStudent": True,
        "grades": {"Math": "A", "English": "B+"}
    }
    
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(new_data, f, ensure_ascii=False, indent=4) # 写入JSON数据到文件
    print("数据已写入 output.json 文件。")
    
    # 转换为JSON字符串
    json_output_string = json.dumps(new_data, ensure_ascii=False, indent=4)
    print("转换为JSON字符串:\n", json_output_string)
    登录后复制

    ensure_ascii=False
    登录后复制
    允许非ASCII字符直接写入,而
    indent=4
    登录后复制
    则让输出的JSON格式化,更易读。

CSV文件读写

CSV(Comma Separated Values)是一种纯文本文件,以逗号分隔值来存储表格数据。Python内置的

csv
登录后复制
模块非常适合处理这类文件,而
pandas
登录后复制
则提供了更高级、更便捷的接口。

  • 使用

    csv
    登录后复制
    模块读取CSV文件:

    import csv
    
    # 假设有一个名为'students.csv'的文件
    # 内容可能像这样:
    # Name,Age,Major
    # Alice,20,Computer Science
    # Bob,22,Mathematics
    try:
        with open('students.csv', 'r', encoding='utf-8', newline='') as f:
            reader = csv.reader(f) # 创建一个reader对象
            header = next(reader) # 读取标题行
            print("CSV文件标题:", header)
            for row in reader:
                print("CSV文件行数据:", row)
    
        # 使用DictReader可以更方便地按字典形式访问数据
        with open('students.csv', 'r', encoding='utf-8', newline='') as f:
            dict_reader = csv.DictReader(f)
            for row_dict in dict_reader:
                print("CSV文件字典行数据:", row_dict['Name'], row_dict['Age'])
    except FileNotFoundError:
        print("students.csv 文件未找到。")
    except Exception as e:
        print(f"读取CSV文件时发生错误: {e}")
    登录后复制

    newline=''
    登录后复制
    参数很重要,它可以防止在Windows系统上写入时出现额外的空行。

  • 使用

    csv
    登录后复制
    模块写入CSV文件:

    import csv
    
    data_to_write = [
        ['Name', 'Age', 'City'],
        ['Charlie', 28, 'London'],
        ['Diana', 35, 'Paris']
    ]
    
    with open('output.csv', 'w', encoding='utf-8', newline='') as f:
        writer = csv.writer(f) # 创建一个writer对象
        writer.writerows(data_to_write) # 写入多行
    print("数据已写入 output.csv 文件。")
    
    # 使用DictWriter写入
    data_dict_to_write = [
        {'Name': 'Eve', 'Age': 29, 'City': 'Berlin'},
        {'Name': 'Frank', 'Age': 40, 'City': 'Rome'}
    ]
    fieldnames = ['Name', 'Age', 'City'] # 必须指定字段名
    
    with open('output_dict.csv', 'w', encoding='utf-8', newline='') as f:
        dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
        dict_writer.writeheader() # 写入标题行
        dict_writer.writerows(data_dict_to_write)
    print("字典数据已写入 output_dict.csv 文件。")
    登录后复制
  • 使用

    pandas
    登录后复制
    读写CSV文件:
    pandas
    登录后复制
    是处理表格数据的利器,它将CSV文件直接映射到DataFrame对象,操作起来非常直观。

    import pandas as pd
    
    # 读取CSV文件
    try:
        df_csv = pd.read_csv('students.csv', encoding='utf-8')
        print("\n使用pandas读取CSV文件:\n", df_csv)
    except FileNotFoundError:
        print("students.csv 文件未找到。")
    
    # 写入CSV文件
    data_for_df = {'Name': ['Grace', 'Heidi'], 'Age': [24, 31], 'City': ['Tokyo', 'Sydney']}
    new_df_csv = pd.DataFrame(data_for_df)
    new_df_csv.to_csv('pandas_output.csv', index=False, encoding='utf-8') # index=False 不写入行索引
    print("使用pandas数据已写入 pandas_output.csv 文件。")
    登录后复制

Excel文件读写

Excel文件(.xlsx, .xls)通常比CSV更复杂,因为它包含多个工作表、格式信息、公式等。

pandas
登录后复制
openpyxl
登录后复制
(主要用于.xlsx文件)是处理Excel的两种主要工具。

  • 使用

    pandas
    登录后复制
    读写Excel文件:
    pandas
    登录后复制
    在处理结构化数据时非常强大,读写Excel文件是其核心功能之一。

    import pandas as pd
    
    # 假设有一个名为'grades.xlsx'的Excel文件
    # 包含Sheet1和Sheet2,Sheet1有姓名和分数
    try:
        # 读取整个Excel文件,默认读取第一个工作表
        df_excel = pd.read_excel('grades.xlsx', engine='openpyxl')
        print("\n使用pandas读取Excel文件(默认第一个工作表):\n", df_excel)
    
        # 读取指定工作表
        df_sheet2 = pd.read_excel('grades.xlsx', sheet_name='Sheet2', engine='openpyxl')
        print("\n使用pandas读取Excel文件(指定Sheet2):\n", df_sheet2)
    except FileNotFoundError:
        print("grades.xlsx 文件未找到。")
    except Exception as e:
        print(f"读取Excel文件时发生错误: {e}")
    
    # 写入Excel文件
    data_for_excel = {
        'Product': ['Laptop', 'Mouse', 'Keyboard'],
        'Price': [1200, 25, 75],
        'Quantity': [10, 50, 30]
    }
    df_new_excel = pd.DataFrame(data_for_excel)
    
    # 写入到新的Excel文件
    df_new_excel.to_excel('pandas_products.xlsx', index=False, sheet_name='Inventory', engine='openpyxl')
    print("使用pandas数据已写入 pandas_products.xlsx 文件。")
    
    # 写入到现有Excel文件的不同工作表
    # 需要使用ExcelWriter
    with pd.ExcelWriter('pandas_products.xlsx', engine='openpyxl', mode='a') as writer:
        df_sheet2_data = pd.DataFrame({'City': ['Paris', 'London'], 'Population': [2141000, 8982000]})
        df_sheet2_data.to_excel(writer, sheet_name='Cities', index=False)
    print("新工作表 'Cities' 已添加到 pandas_products.xlsx。")
    登录后复制

    注意

    engine='openpyxl'
    登录后复制
    是推荐的写法,因为它支持.xlsx格式,并且是现代Excel文件的标准。

  • 使用

    openpyxl
    登录后复制
    读写Excel文件:
    openpyxl
    登录后复制
    提供了更底层的控制,你可以精确地操作工作簿、工作表和单元格。它非常适合那些不需要
    pandas
    登录后复制
    的DataFrame结构,但需要精细控制Excel文件内容的场景。

    Find JSON Path Online
    Find JSON Path Online

    Easily find JSON paths within JSON objects using our intuitive Json Path Finder

    Find JSON Path Online 30
    查看详情 Find JSON Path Online
    from openpyxl import Workbook, load_workbook
    
    # 写入Excel文件
    wb = Workbook() # 创建一个新的工作簿
    ws = wb.active # 获取活动工作表,默认名为'Sheet'
    ws.title = "Sales Data" # 重命名工作表
    
    # 写入标题行
    ws.append(['Date', 'Region', 'Amount'])
    # 写入数据
    ws.append(['2023-01-01', 'East', 100])
    ws.append(['2023-01-02', 'West', 150])
    
    # 创建另一个工作表
    ws2 = wb.create_sheet("Summary")
    ws2['A1'] = "Total Sales"
    ws2['B1'] = 250
    
    wb.save("openpyxl_sales.xlsx")
    print("使用openpyxl数据已写入 openpyxl_sales.xlsx 文件。")
    
    # 读取Excel文件
    try:
        wb_read = load_workbook("openpyxl_sales.xlsx")
        sheet_names = wb_read.sheetnames
        print("\n使用openpyxl读取Excel文件的工作表名称:", sheet_names)
    
        # 读取指定工作表
        sales_sheet = wb_read["Sales Data"]
        for row in sales_sheet.iter_rows(min_row=1, max_col=3, values_only=True):
            print("从Sales Data读取:", row)
    except FileNotFoundError:
        print("openpyxl_sales.xlsx 文件未找到。")
    登录后复制

Python处理大型JSON/CSV/Excel文件时有哪些性能优化技巧?

在处理大型文件时,内存占用和处理速度往往成为瓶颈。我个人在处理GB级别的数据时,经常会遇到内存溢出或者程序运行缓慢的问题,这让我不得不深入思考如何优化。

对于JSON文件,如果文件非常大,一次性

json.load()
登录后复制
可能会耗尽内存。这时,可以考虑使用流式解析库,比如
ijson
登录后复制
。它不会一次性将整个JSON结构加载到内存中,而是像一个迭代器一样,逐个解析JSON中的元素。这对于处理日志文件或API响应中包含大量记录的超大JSON文件特别有用。虽然用起来比
json
登录后复制
模块稍微复杂一点,但当你面对内存墙时,它绝对是救星。

CSV文件的优化策略则更为多样。首先,

pandas.read_csv()
登录后复制
本身就非常高效,因为它底层是用C语言实现的。但即便如此,对于亿级行的数据,它也可能吃不消。这时,有几个办法:

  • chunksize
    登录后复制
    参数:
    pd.read_csv('large.csv', chunksize=10000)
    登录后复制
    会返回一个迭代器,每次读取指定行数的数据块(DataFrame)。这样你可以逐块处理数据,而不是一次性加载所有。这就像吃一头大象,你得一口一口来。
  • usecols
    登录后复制
    参数:
    如果你只需要CSV文件中的几列,明确指定
    usecols=['col1', 'col2']
    登录后复制
    可以显著减少内存占用,因为
    pandas
    登录后复制
    只会加载你需要的列。
  • dtype
    登录后复制
    参数:
    提前指定列的数据类型(例如
    {'age': int, 'salary': float}
    登录后复制
    ),可以帮助
    pandas
    登录后复制
    更有效地分配内存,避免默认的宽泛类型(如
    object
    登录后复制
    )带来的额外开销。
  • 原生
    csv
    登录后复制
    模块:
    对于那些只需要简单行处理,不需要DataFrame复杂功能的场景,Python内置的
    csv
    登录后复制
    模块在内存效率上可能更高,因为它每次只处理一行。

Excel文件的优化相对复杂一些,因为Excel文件本身就比CSV更重。

  • pandas
    登录后复制
    chunksize
    登录后复制
    虽然
    pandas.read_excel()
    登录后复制
    没有直接的
    chunksize
    登录后复制
    参数,但你可以通过
    openpyxl
    登录后复制
    先加载工作簿,然后逐行读取,再将这些行转换为小的DataFrame。不过,这会增加代码的复杂性。
  • usecols
    登录后复制
    dtype
    登录后复制
    同样适用于
    pandas.read_excel()
    登录后复制
    ,能有效减少内存。
  • openpyxl
    登录后复制
    当你需要对Excel文件进行非常精细的、非数据分析性质的操作时,
    openpyxl
    登录后复制
    是更好的选择。它可以让你只加载特定的工作表,甚至只加载特定单元格区域,从而避免将整个工作簿加载到内存中。例如,
    load_workbook(filename, read_only=True)
    登录后复制
    以只读模式打开,并且
    data_only=True
    登录后复制
    可以只加载单元格的计算结果而不是公式,这在某些情况下也能节省资源。

总的来说,处理大型文件,核心思想就是“分而治之”——不要试图一次性加载所有数据,而是分块、按需加载,或者选择更内存高效的工具。

如何在Python中处理JSON/CSV/Excel文件的编码问题和异常?

编码问题和异常处理,这是我日常工作中经常遇到的“小麻烦”,尤其是在处理来自不同源的数据时。一个文件看起来正常,结果一读就报错

UnicodeDecodeError
登录后复制
,真是让人头大。

编码问题

Python 3默认使用UTF-8编码,这是好事,因为UTF-8是目前最通用的编码。但总有些老旧系统或特定软件会生成其他编码的文件,比如GBK、Latin-1、CP1252等。

  • open()
    登录后复制
    函数的
    encoding
    登录后复制
    参数:
    这是解决编码问题的核心。无论是
    json.load()
    登录后复制
    /
    dump()
    登录后复制
    还是
    csv.reader()
    登录后复制
    /
    writer()
    登录后复制
    ,它们都依赖于
    open()
    登录后复制
    函数来处理文件。当你遇到
    UnicodeDecodeError
    登录后复制
    时,首先尝试指定
    encoding
    登录后复制
    参数。
    # 尝试多种编码
    encodings_to_try = ['utf-8', 'gbk', 'latin-1', 'cp1252']
    for enc in encodings_to_try:
        try:
            with open('some_file.csv', 'r', encoding=enc) as f:
                # 成功读取,进行后续处理
                print(f"文件成功以 {enc} 编码读取。")
                break
        except UnicodeDecodeError:
            print(f"尝试 {enc} 编码失败。")
        except FileNotFoundError:
            print("文件未找到。")
            break
    else:
        print("所有尝试的编码都失败了,文件可能使用了不常见的编码或已损坏。")
    登录后复制
  • pandas
    登录后复制
    encoding
    登录后复制
    参数:
    pd.read_csv()
    登录后复制
    pd.read_excel()
    登录后复制
    也提供了
    encoding
    登录后复制
    参数,用法类似。
    pd.read_csv('data.csv', encoding='gbk')
    登录后复制
  • BOM(Byte Order Mark): 有时UTF-8文件会带BOM头,这可能会导致一些解析器出错。
    open()
    登录后复制
    函数通常能自动处理UTF-8 BOM,但如果遇到问题,可以尝试
    encoding='utf-8-sig'
    登录后复制

异常处理

健壮的代码必须能够优雅地处理错误,而不是直接崩溃。

try-except
登录后复制
块是你的好朋友。

  • FileNotFoundError
    登录后复制
    文件不存在是最常见的错误。

    try:
        with open('non_existent_file.txt', 'r') as f:
            content = f.read()
    except FileNotFoundError:
        print("错误:文件不存在,请检查路径。")
    登录后复制
  • json.JSONDecodeError
    登录后复制
    当JSON文件内容不符合JSON格式规范时会抛出。

    import json
    try:
        json.loads('{"key": "value",}') # 逗号是错误的
    except json.JSONDecodeError as e:
        print(f"JSON解析错误: {e}")
    登录后复制
  • csv.Error
    登录后复制
    csv
    登录后复制
    模块在遇到格式不正确的CSV行时可能会抛出此异常,例如引号不匹配。

    import csv
    from io import StringIO
    
    malformed_csv = StringIO('col1,col2\n"value1,value2\n') # 缺少结束引号
    try:
        reader = csv.reader(malformed_csv)
        for row in reader:
            print(row)
    except csv.Error as e:
        print(f"CSV格式错误: {e}")
    登录后复制
  • pandas
    登录后复制
    openpyxl
    登录后复制
    相关的异常:

    • BadZipFile
      登录后复制
      (from
      zipfile
      登录后复制
      module, often wrapped by
      openpyxl
      登录后复制
      or
      pandas
      登录后复制
      ): 当Excel文件损坏或不是一个有效的zip文件时(.xlsx文件本质上是zip压缩包)。
    • KeyError
      登录后复制
      : 尝试访问不存在的工作表名称或列名时。
    • IndexError
      登录后复制
      : 尝试访问不存在的行或列索引时。
    • ValueError
      登录后复制
      : 数据类型转换失败时。

我的经验是,不要害怕使用

try-except
登录后复制
。在关键的文件操作点,总是预设可能发生的错误,并给出有意义的反馈或回滚机制。这不仅让程序更稳定,也让调试变得更容易。

Python处理这些文件格式时,
pandas
登录后复制
与原生库(
json
登录后复制
/
csv
登录后复制
/
openpyxl
登录后复制
)的选择与权衡是什么?

这是一个很好的问题,因为我发现很多人在Python中处理数据时,要么无脑

pandas
登录后复制
,要么死守原生库,而没有真正理解它们各自的优势和适用场景。其实,这就像选择交通工具:去楼下便利店你不会开飞机,长途旅行你也不会步行。

原生库(

json
登录后复制
,
csv
登录后复制
,
openpyxl
登录后复制
)的优势与适用场景:

  • 精细控制与低开销: 原生库提供了对文件格式最直接、最底层的操作接口。你可以逐行、逐个字段地读取CSV,逐个键值对地处理JSON

以上就是如何用Python读写JSON/CSV/Excel文件?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号