如何将项目附加到另一个文件的列表中并使用更新的列表保存该文件

时间:2014-03-23 22:03:49

标签: python list

我有一个python文件(list.py),其列表如下:

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

我希望能够打开并在字母中添加下一个字母“D”,然后保存更新的list.py,以便它具有以下列表:

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

我将来会访问和更新。

我尝试导入列表并使用f.write,但它将输出保存为字符串。

2 个答案:

答案 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']
>>>