介绍
Python提供了多种保存数据的方式,包括文本文件(txt)、JSON文件和CSV文件。这几种是最简单的保存方式,但也很实用。
Python打开文件(保存文件的前提)
python打开文件有几种方式:
- 内置的open函数
- os模块的os.open函数
- io模块的io.open函数
- pathlib模块的Path类的open
……还有一些第三方库,这里是面向初学者的教程,不做介绍
一般使用内置的open函数就足够了
内置open()函数用法
open函数是Python的内置函数,用于打开一个文件,并返回一个文件对象。当你使用open打开文件后,你需要在完成操作后,使用file.close()方法手动关闭文件。它的基本语法如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file:必需,文件路径(字符串)或者是一个包含文件名和路径的pathlib.Path对象。
- mode:可选,文件打开模式,默认为'r'。常见的模式有:
- 'r':只读模式(默认)。
- 'w':写入模式,如果文件存在则清空,不存在则创建。
- 'a':追加模式,如果文件存在,新的内容将被写入到已有内容之后,如果文件不存在,创建新文件进行写入。
- 'b':二进制模式。
- '+':读写模式(可添加到其他模式中使用)。
- buffering:设置缓冲策略。
- encoding:文件的编码格式。
- errors:报错级别。
- newline:区分换行符。
一个简单的例子
# 打开file.txt文件,如果文件不存在则创建文件,如果文件存在则清空文件内容
# 以utf-8编码格式写入文件
file = open("file.txt", "w", encoding="utf-8")
# 写入内容:Hello World
file.write("Hello World")
# 关闭文件
file.close()
使用with open()
with open:这是一种上下文管理协议(Context Management Protocol),它可以自动管理资源,无论在处理文件过程中是否发生异常,都能保证with语句执行完毕后已经关闭了打开的文件句柄。推荐使用!
with open("file.txt", "r", encoding="utf-8") as file:
# 读取文件内容
content = file.read()
# 打印文件内容
print(content)
使用文本文件(txt)保存数据
文本文件(txt):这是最简单的数据保存方式,可以保存任何字符串数据。但是,文本文件不具有结构,不适合保存复杂的数据结构,如列表或字典。
with open('file.txt', 'w') as f:
f.write('Hello, World!')
读取数据也很简单:
# 读取数据
text = "" # 用于存储文件中的内容
with open("file.txt", "r") as f:
text = f.read() # 读取文件中的所有内容
print(text) # Hello, World!
使用JSON保存数据
JSON文件:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易地读写数据。JSON对于保存复杂的数据结构,如列表或字典,非常有用。
import json # 导入json模块,内置模块,无需安装
# 需要保存的数据
dict = {
"name": "张三",
"age": 18,
}
list = [1, 2, 3, 4, 5]
with open("dict.json", "w") as f:
# dict: 需要写入的数据
# f: 文件对象
# ensure_ascii=False: 不使用ASCII编码,即支持中文
# indent=4: 缩进4个空格,美化输出
json.dump(dict, f, ensure_ascii=False, indent=4) # 将dict写入文
with open("list.json", "w") as f:
json.dump(list, f) # 将list写入文件
json.dump是Python的json模块中的一个函数,它用于将Python对象编码成JSON格式并写入到文件中。
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
它的基本语法如下(具体访问json --- JSON 编码和解码器 — Python 3.12.3 文档):
- obj:要编码为JSON的Python对象。
- fp:一个.write()-supporting file-like object(支持.write()方法的类文件对象)。
- skipkeys:默认值是False,如果dict的keys内的数据不是基本类型(str, unicode, int, long, float, bool, None),设置为False时,就会报TypeError的错误。如果设置为True,这类key-value pair会被忽略。
- ensure_ascii:默认值是True,如果obj中含有non-ASCII的字符,那么这些字符会被如何处理。如果ensure_ascii为True,这些字符会被转义为\uXXXX的序列;如果ensure_ascii为False,这些字符会被输出。
- check_circular:默认值是True,如果检测到循环引用(circular reference),即在待序列化的dict和list中存在相互引用的情况,那么会抛出OverflowError的错误。如果check_circular为False,这样的错误就会被忽略。
- allow_nan:默认值是True,如果dict内含有NaN、Infinity和-Infinity,如果设置为True,它们会被序列化成相应的值;如果设置为False,会抛出ValueError的错误。
- indent:应该是一个非负的整数或者字符串,如果是非负整数,那么JSON array元素和object成员会被美化输出,前面会增加indent个空格;如果是字符串(比如'\t'),那么元素和成员会被这个字符串缩进。
- separators:用来指定分隔符,实际上是一个元组,第一个元素用来分隔dict中的items,第二个元素用来分隔array中的items。默认是(', ', ': '),如果想输出最紧凑的JSON字符串,可以指定为(',', ':')。
- default:一个函数,它应该返回一个可序列化的版本的其被传入的参数,否则将抛出TypeError。
- sort_keys:如果指定为True,那么输出的JSON字符串的key将会按照字母顺序排序后输出。
读取数据:
# 读取数据
with open("dict.json", "r") as f:
dict = json.load(f) # 读取文件中的数据
print(dict)
with open("list.json", "r") as f:
list = json.load(f) # 读取文件中的数据
print(list)
使用CSV储存数据
CSV文件:CSV(Comma-Separated Values)是一种常见的数据存储格式,它将每行数据分割成多个字段,通过逗号分隔。CSV文件可以被大多数的电子表格软件,如Microsoft Excel和Google Sheets,直接打开。
import csv # 导入csv模块,内置模块,无需安装
title = ["Name", "Age"] # 表头
data = [["John", "30"], ["Jane", "25"], ["Tom", "22"]] # 数据
with open("data.csv", "w", newline="") as f:
writer = csv.writer(f) # 创建一个csv写入对象
writer.writerow(title) # 写入表头,witerow只能写入一行
writer.writerows(data) # 将data写入文件,writerows可以写入多行
读取数据:
# 读取数据
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f) # 创建一个csv读取对象
for row in reader: # 逐行读取
print(row)
使用pandas储存CSV数据
除了使用内置的csv库,还能使用第三方库:pandas
# 安装pandas模块
pip install pandas
储存数据:
# 使用pandas写入和读取csv文件
import pandas as pd # 导入pandas模块,需要安装
data = {"Name": ["John", "Jane", "Tom"], "Age": [30, 25, 22]} # 创建一个字典数据
data = [
{"Name": "John", "Age": 30},
{"Name": "Jane", "Age": 25},
{"Name": "Tom", "Age": 22},
] # 创建一个列表数据
# 上面两种方式都可以达到同样的效果
df = pd.DataFrame(data) # 创建一个DataFrame对象,使用data数据
df.to_csv(
"data.csv", index=False, encoding="utf-8"
) # 将数据写入文件,index=False表示不写入行索引,encoding="utf-8"表示使用utf-8编码
读取数据:
# 读取数据
df = pd.read_csv("data.csv") # 读取文件中的数据
print(df)
效果如下:
Name Age
0 John 30
1 Jane 25
2 Tom 22