如何向另一个文件的列表中添加项目并保存更新后的列表
我有一个Python文件(list.py),里面有一个字母列表,如下所示:
letters=['A','B','C']
我想打开这个文件,然后在字母列表中添加下一个字母'D',最后保存更新后的list.py文件,这样它就会变成下面这个列表:
letters=['A','B','C','D']
我将来会用到并更新这个列表。
我试着导入这个列表,然后用f.write来写入,但它保存的内容是字符串格式。
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]"
这样的元素可以出现在列表中,而正则引擎不会把这个元素中的 ]
视为需要匹配的那个 \]
。
为了实现你想要的功能,你可以使用 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']
>>>