我有一个python文件(list.py),其列表如下:
letters=['A','B','C']
我希望能够打开并在字母中添加下一个字母“D”,然后保存更新的list.py,以便它具有以下列表:
letters=['A','B','C','D']
我将来会访问和更新。
我尝试导入列表并使用f.write,但它将输出保存为字符串。
答案 0 :(得分:1)
这样做你想要的:
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]"
与]
必须匹配]
答案 1 :(得分:1)
对于您想要的功能,您可以使用pickle module。它就像读写文件一样简单
以下是您特定情况的简单示例代码 -
在此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()
现在,在下面的代码中(在shell中执行),正在读取"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()
要检查文件是否确实具有该值,请重新启动shell,然后再次读取该文件并显示如下所示的列表 -
>>> import pickle
>>> fh = open("list.pkl", 'rb')
>>> letters = pickle.load(fh)
>>> letters
['A', 'B', 'C', 'D']
>>>