如何向另一个文件的列表中添加项目并保存更新后的列表

2 投票
2 回答
5580 浏览
提问于 2025-04-17 23:34

我有一个Python文件(list.py),里面有一个字母列表,如下所示:

letters=['A','B','C']

我想打开这个文件,然后在字母列表中添加下一个字母'D',最后保存更新后的list.py文件,这样它就会变成下面这个列表:

letters=['A','B','C','D']

我将来会用到并更新这个列表。

我试着导入这个列表,然后用f.write来写入,但它保存的内容是字符串格式。

2 个回答

2

这个代码可以实现你想要的效果:

import re

text = '''
def f(i):
    return i*2

letters=['A','B','C']  

x = 1
print f(x)'''

# creating a file containing the list
with open('li.py','w') as f:
    f.write(text)

# reading the file
with open('li.py','r') as f:
    cont = f.read()

print cont

print '======================='

rgx = re.compile('(^letters *= *\[.*)(\][ \t]*$)',re.MULTILINE)

x = 'D'
print rgx.sub('\\1,%r\\2' % x,cont)

结果

def f(i):
    return i*2

letters=['A','B','C']  

x = 1
print f(x)
=======================

def f(i):
    return i*2

letters=['A','B','C','D']  

x = 1
print f(x)

不过,可能会有一些特殊情况,我现在想不到,可能会导致问题。

.

这个正则表达式的结构是:

\[.*\],其中 \[ 代表字符 [(因为在正则表达式中,[] 有特殊含义,所以需要用反斜杠来转义)
\] 代表字符 ]

.* 表示可以匹配任意字符的连续串,但不能是换行符 \n

[ \t\r]* 表示可以匹配空格、制表符或字符 \r(这个字符在Windows系统中是换行符 \n 前面的那个)。

^ 代表一行的开始,而 $ 代表一行的结束(在 \n 之前),因为启用了 re.MULTILINE 这个标志。

一开始,正则引擎会找到符合 ^letters *= *\[.* 的字符串,也就是说,它会找到以 letters = [ 开头的那一行,并匹配 [ 后面的所有字符,直到这一行的结束,也就是下一个 \n(实际上 $ 并不是必须的,因为点号 . 不会匹配 \n)。

但是接下来,由于下一个字符必须是 ],正则引擎会向后查找,直到找到这个字符。因此,它找到的 ] 一定是这一行中的最后一个。所以像 "[fgsrhsr]" 这样的元素可以出现在列表中,而正则引擎不会把这个元素中的 ] 视为需要匹配的那个 \]

3

为了实现你想要的功能,你可以使用 pickle模块。这就像在文件中读写数据一样简单。
下面是一个简单的示例代码,适合你的情况-

在这个Python脚本中,创建了一个列表 Letters,并将其保存到一个名为 "list.pkl" 的文件中-

import pickle

letters=['A','B','C']
#Writing the letters list into the file.
fh = open("list.pkl", 'wb')
pickle.dump(letters, fh)
fh.close()

接下来,在下面的代码中(在命令行中执行),读取 "list.pkl" 文件,将字母 'D' 添加到列表中,然后再把这个列表写回到文件里-

>>> import pickle
>>> fh = open("list.pkl", 'rb')
>>> letters = pickle.load(fh)
>>> print letters
['A', 'B', 'C']
>>> fh.close()
>>> letters.append('D')
>>> fh = open("list.pkl", 'wb')
>>> pickle.dump(letters, fh)
>>> fh.close()

为了检查文件中是否真的有这个值,可以重启命令行,再次读取文件并显示列表,像这样演示-

>>> import pickle
>>> fh = open("list.pkl", 'rb')
>>> letters = pickle.load(fh)
>>> letters
['A', 'B', 'C', 'D']
>>> 

撰写回答