如何将列表保存到文件并将其作为列表类型读取?

How to save a list to a file and read it as a list type?

假设我有列表 score = [1,2,3,4,5],它在我的程序运行时发生了变化。我怎样才能将它保存到一个文件中,以便下次运行该程序时,我可以将更改后的列表作为 list 类型访问?

我试过:

score=[1,2,3,4,5]

with open("file.txt", 'w') as f:
    for s in score:
        f.write(str(s) + '\n')

with open("file.txt", 'r') as f:
    score = [line.rstrip('\n') for line in f]


print(score)

但这会导致列表中的元素是字符串而不是整数。

您可以为此使用 pickle 模块。 这个模块有两个方法,

  1. Pickling(dump):将 Python 个对象转换为字符串表示形式。
  2. Unpickling(load):从存储的字符串表示中检索原始对象。

https://docs.python.org/3.3/library/pickle.html

代码:

>>> import pickle
>>> l = [1,2,3,4]
>>> with open("test", "wb") as fp:   #Pickling
...   pickle.dump(l, fp)
... 
>>> with open("test", "rb") as fp:   # Unpickling
...   b = pickle.load(fp)
... 
>>> b
[1, 2, 3, 4]

还有Json

  1. dump/dumps: 序列化
  2. load/loads:反序列化

https://docs.python.org/3/library/json.html

代码:

>>> import json
>>> with open("test", "w") as fp:
...     json.dump(l, fp)
...
>>> with open("test", "r") as fp:
...     b = json.load(fp)
...
>>> b
[1, 2, 3, 4]

pickle 和其他序列化包工作。将它写入 .py 文件,然后您可以导入。

>>> score = [1,2,3,4,5]
>>> 
>>> with open('file.py', 'w') as f:
...   f.write('score = %s' % score)
... 
>>> from file import score as my_list
>>> print(my_list)
[1, 2, 3, 4, 5]

我决定不想使用 pickle,因为我希望能够在测试期间轻松打开文本文件并更改其内容。因此,我这样做了:

score = [1,2,3,4,5]

with open("file.txt", "w") as f:
    for s in score:
        f.write(str(s) +"\n")
score = []
with open("file.txt", "r") as f:
  for line in f:
    score.append(int(line.strip()))

所以文件中的项目被读取为整数,尽管作为字符串存储到文件中。

如果不想使用 pickle,可以将列表存储为文本,然后对其求值:

data = [0,1,2,3,4,5]
with open("test.txt", "w") as file:
    file.write(str(data))

with open("test.txt", "r") as file:
    data2 = eval(file.readline())

# Let's see if data and types are same.
print(data, type(data), type(data[0]))
print(data2, type(data2), type(data2[0]))

[0, 1, 2, 3, 4, 5] class 'list' class 'int'

[0, 1, 2, 3, 4, 5] class 'list' class 'int'

我正在使用 pandas。

import pandas as pd
x = pd.Series([1,2,3,4,5])
x.to_excel('temp.xlsx')
y = list(pd.read_excel('temp.xlsx')[0])
print(y)

如果您要导入 pandas 用于其他计算,请使用此选项。

如果需要,可以使用 numpy 的保存功能将列表保存为文件。 假设您有两个列表

sampleList1=['z','x','a','b']
sampleList2=[[1,2],[4,5]]

这里是将列表保存为文件的功能,记住你需要保留扩展名.npy

def saveList(myList,filename):
    # the filename should mention the extension 'npy'
    np.save(filename,myList)
    print("Saved successfully!")

这是将文件加载到列表中的函数

def loadList(filename):
    # the filename should mention the extension 'npy'
    tempNumpyArray=np.load(filename)
    return tempNumpyArray.tolist()

一个工作示例

>>> saveList(sampleList1,'sampleList1.npy')
>>> Saved successfully!
>>> saveList(sampleList2,'sampleList2.npy')
>>> Saved successfully!

# loading the list now 
>>> loadedList1=loadList('sampleList1.npy')
>>> loadedList2=loadList('sampleList2.npy')

>>> loadedList1==sampleList1
>>> True

>>> print(loadedList1,sampleList1)

>>> ['z', 'x', 'a', 'b'] ['z', 'x', 'a', 'b']

我不喜欢很多答案的是,它通过每行写入文件行来进行过多的系统调用。恕我直言,最好用'\n'(行return)加入列表,然后只将它写入文件一次:

mylist = ["abc", "def", "ghi"]
myfile = "file.txt"
with open(myfile, 'w') as f:
    f.write("\n".join(mylist))

然后打开它并再次获取您的列表:

with open(myfile, 'r') as f:
    mystring = f.read()
my_list = mystring.split("\n")

works, you should really be using python's json 模块(参见 post 的末尾以与 pickle 进行比较):

import json

score=[1,2,3,4,5]

with open("file.json", 'w') as f:
    # indent=2 is not needed but makes the file human-readable 
    # if the data is nested
    json.dump(score, f, indent=2) 

with open("file.json", 'r') as f:
    score = json.load(f)

print(score)

优点:

  1. json 是一种广泛采用的标准化数据格式,因此非python 程序可以轻松阅读和理解 json 文件
  2. json 文件是人类可读且易于编辑的(纯文本)
  3. 任何嵌套或非嵌套的 list/dictionary 结构都可以保存到 json 文件中(只要所有内容都是可序列化的)。

缺点

  1. 数据以纯文本形式存储(即未压缩),这使得它对于大量数据来说是一个缓慢且 space 低效的选择。
  2. list/dictionary 的内容需要可序列化,然后才能将其保存为 json。 json 模块可以让你保存字符串、整数、浮点数、布尔值和 None 值,你需要编写自定义序列化和反序列化代码来保存对象、类 和函数.

pickle vs json,我应该用哪个?:

  • 如果您想存储您知道只会在 python 程序上下文中使用的内容,请使用 pickle
  • 如果您需要保存默认情况下不可序列化的数据(即对象),请省去麻烦并使用pickle
  • 如果您需要平台无关的解决方案,请使用 json
  • 如果您需要能够直接检查和编辑数据,请使用json
  • 如果您需要稳健和长期的东西,请使用 json(如果您更改 classes/files 的位置或对代码进行重大更改,pickle 将无法正常工作)
errorlist = ['aaaa', 'bbbb', 'cccc', 'dddd']

f = open("filee.txt", "w")
f.writelines(nthstring + '\n' for nthstring in errorlist)

f = open("filee.txt", "r")
cont = f.read()
contentlist = cont.split()
print(contentlist)

我遇到了类似的问题,我需要读取保存为文本文件的列表。该列表有多个层,因此使用 split 无济于事。 例如:

list1.txt
[(1,2,3),['a','b'],'a1']

所以我做了什么,我将 list.txt 更改为 list.py,然后从 python 文件导入列表。 例如:

   list1.py
   a = [(1,2,3),['a','b'],'a1']

然后:

from list1 import a
print(a)