在 Python 中读取和写入列表到文件

介绍

Python 程序员大量使用数组、列表和字典作为序列化数据结构。 持久存储这些数据结构需要文件或数据库才能正常工作。

在本文中,我们将了解如何将列表写入文件,以及如何将该列表读回内存。

将数据写入文件,和 从文件中读取数据, Python 编程语言提供标准方法 write()read() 用于处理单行,以及 writelines()readlines() 用于处理多行。 此外,无论是 picklejson 模块也允许处理序列化数据集的巧妙方法。

使用 读()写() 方法

处理字符(字符串)的基本 read()write() 方法效果很好。 将这样的列表逐行保存到文件中 listfile.txt 可以按如下方式完成:


places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write(f'{listitem}n')

listitem 由换行符扩展 "n", 首先,然后存储到输出文件中。 现在我们可以看看如何从文件中读取整个列表 listfile.txt 回到记忆中:


places = []


with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

请记住,您需要从字符串末尾删除换行符。 在这种情况下,Python 也允许对字符串进行列表操作,这对我们很有帮助。 这种删除只是作为对字符串本身的列表操作完成的,它保留了除最后一个元素之外的所有内容。 此元素包含字符 "n" 表示 UNIX/Linux 系统上的换行符。

使用 写行()阅读线() 方法

正如本文开头提到的,Python 也包含这两种方法—— writelines()readlines() – 分别在一个步骤中写入和读取多行。 让我们将整个列表写入磁盘上的文件:


places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines(f"{place for place in places_list}n")

要从磁盘上的文件中读取整个列表,我们需要:


places = []


with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()
    for line in filecontents:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

上面的代码遵循从其他编程语言借来的更传统的方法。 让我们把它写在更多 蟒蛇式 方式:


places = []


with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

首先,通过读取文件内容 readlines(). 其次,在一个 for 从每一行循环,使用删除换行符 rstrip() 方法。 第三,将该字符串作为新的列表项添加到地点列表中。

与之前的清单相比,代码要紧凑得多,但对于 Python 初学者来说可能更难阅读。

使用 Joblib 模块

到目前为止解释的初始方法以人类仍然可以阅读的方式存储列表 - 确切地说是文件中的顺序列表。 这非常适合创建简单的报告或输出导出文件以供用户进一步使用,例如 CSV 文件。 然而——如果你的目标只是将一个列表序列化成一个可以稍后加载的文件,那么就不需要以人类可读的格式存储它。

joblib 模块提供了转储 Python 对象的最简单方法(实际上可以是任何对象):

import joblib

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

joblib.dump(places, 'places.sav')

places = joblib.load('places.sav')
print(places) 

joblib 仍然是以有效格式序列化对象并稍后加载它们的最简单和最干净的方法。 您可以使用任意格式,例如 .sav, .data等。这并不重要——两者都 joblib 和替代品,如 pickle 将读取文件就好了。

使用 泡菜 模块

作为替代 joblib, 我们可以用 pickle! 它的 dump() 方法将列表有效地存储为二进制数据流。 首先,输出文件 listfile.data 打开二进制写入("wb")。 其次,列表存储在打开的文件中,使用 dump() 方法:

import pickle

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    
    pickle.dump(places, filehandle)

下一步,我们从文件中读取列表,如下所示。 首先,输出文件 listfile.data 打开二进制文件以供读取("rb")。 其次,地点列表是使用 load() 方法:

import pickle

with open('listfile.data', 'rb') as filehandle:
    
    placesList = pickle.load(filehandle)

这里的两个例子演示了字符串的用法。 虽然, pickle 适用于各种 Python 对象,例如字符串、数字、自定义结构以及 Python 提供的所有其他内置数据结构。

使用 JSON 格式

二进制数据格式 pickle 用途是特定于 Python 的。 为了提高不同程序之间的互操作性,JavaScript Object Notation (JSON) 提供了一个易于使用和人类可读的模式,因此在序列化文件和通过 API 共享文件方面变得非常流行。

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

以下示例演示如何使用 JSON 模块。 打开输出文件进行写入后, dump() 方法使用 JSON 表示法将基本列表存储在文件中:

import json


basic_list = [1, "Cape Town", 4.6]


with open('listfile.txt', 'w') as filehandle:
    json.dump(basic_list, filehandle)

将输出文件的内容读回内存就像写入数据一样简单。 对应的方法 dump() 被命名 load():

import json


with open('listfile.txt', 'r') as filehandle:
    basic_list = json.load(filehandle)

结论

我们上面展示的不同方法包括从简单的写入/读取数据到使用 pickle 和 JSON 通过二进制流转储/加载数据。 这简化了持久存储列表并将其读回内存。

时间戳记:

更多来自 堆栈滥用