在文件中创建Python列表并稍后编辑

0 投票
5 回答
817 浏览
提问于 2025-04-18 05:20

我正在制作一个程序,用来把一些数据存储在txt文件里。我现在的做法是这样,虽然能用,但我想把数据改成列表,这样用list.remove和list.append来编辑内容会更方便。这是我现在的格式:

Username:data1:data2:data3:data++

我想要达到的效果是:

Username:[data1, data2, data3, data++]

为什么我想这样做呢?

因为用“:”来分隔的数据编辑起来不是“Pythonic way”,所以我想把它们转换成列表...

我用这个过滤器来获取特定的行:

textfile = open("%s/CreativePoints/Data/plotovimemberi.txt"%pluginlokacija2, 'r+')
a = filter(lambda x: x.startswith("%s:%s"%(targetplot, userID)), \
                                          textfile.readlines())

所以现在的数据文件看起来是这样的:

Username:data1:data2
Username1:data134:data453:data6534
Username3:data5345:data678:data111:data434
and so on...

我想要达到的效果是:

Username:[data1, data2]
Username1:[data134, data453, data6534]
Username3:[data5345, data678, data111, data434]
and so on...

为什么呢?因为我想用上面提到的过滤器来获取文件中的某一行,然后编辑这个列表... 所以我只需要用“line.split(':')[1]”来分割行,得到一个可以编辑的数据列表,这样我就可以用list.append和list.remove来修改了...

谢谢你的阅读和回答! :)

5 个回答

0

你可以使用 pickle 或者 pyyaml 来把你的对象存储到文本文件里。下面是使用 pickle 的一个例子:

import pickle
# save some list
lst=['hello','pickle']
pickle.dump(lst, open('lst.txt','w'))
# load list from txt file
lst2=pickle.load(open('lst.txt'))
print(lst2)

如果你想把数据存储成可读的形式,可以使用 pyyaml:

from yaml import load, dump
# dump list in readable form
lst=['hello', 'yaml']
open('lst2.txt', 'w').write(dump(lst))
# load list from yaml file
print(load(open('lst2.txt')))
0

我觉得你需要一个字典,而不是一个列表,除非用户名不是唯一的,这种情况下你可以使用列表。

data_text = '''Username1:data1:data2:data3:data++
Username2:data1:data2:data3:data++
Username3:data1:data2:data3:data++
Username3:data4:data5:data6:data++'''

lines = data_text.split('\n')

data_dict = {}
data_list = []
for l in lines:
    fields = l.split(':')
    user = fields[0]
    data = fields[1:]
    data_dict[user] = data
    data_list.append((user,data))

print(data_text)
print(data_dict)
print(data_list)
0

根据需要进行了编辑:

list = [data1, data2, data3, data++]

file = open("file.txt", "w")
file.write("Username: " + str(list))
file.close
0

我觉得你应该了解一下ConfigParser这个库,链接在这里:https://docs.python.org/2/library/configparser.html。这个库可以帮助你解决读取和写入的问题。你可以在这里了解更多关于在ConfigParser中使用列表的内容:在ConfigParser中使用列表

1

虽然我觉得我已经给了你一个问题的答案(见下面的代码),但我有一些想法想和你分享:

  • 在文本文件中使用冒号作为分隔符并不是“不符合Python风格”,这其实和Python无关,而是关于数据的处理。

  • 你应该考虑使用像YAML或JSON这样的格式来存储你的数据;这样你可以使用一些库来帮你处理大部分细节。

  • 按照你提议的方案,你的数据记录中不能包含“,”,也不能简单地在记录的开头或结尾加空格。这些问题应该由任何合理的JSON或YAML库来帮你解决。

  • 你还可以考虑使用像sqlite这样的数据库(Python自带的)。虽然这需要多花点功夫,但你可以根据自己选择的条件来搜索记录,还能轻松地删除和添加记录。用普通文本文件的话,你就得自己管理这些事情。

这是我的解决方案:

from pprint import pprint

def writefile(outfilename,db):
    outfile=open(outfilename,'wt')
    for username,userdata in db:
        userdatastr= ','.join(userdata)
        outfile.write('%s: [%s]\n' % (username,userdatastr))
    # or, better, use 'with file("...") as ...'
    outfile.close()

def readfile(infilename):
    infile=open(infilename,'rt')
    db=[]
    for line in infile:
        username, rest = line.split(':',1)
        lstart= rest.find('[')
        if lstart==-1:
            raise RuntimeError('couldn''t find "[" for user "%s"' % username)
        lend= rest.rfind(']')
        if lend==-1:
            raise RuntimeError('couldn''t find "]" for user "%s"' % username)
        userdata = rest[lstart+1:lend].split(',')
        db.append((username,userdata))
    return db

db=[('Bob',['foo','bar','baz']),
    ('Jane',['oof','rab','zab','xuuq']),
    ('Rudy',['some','data'])]

writefile('db.txt',db)

indb=readfile('db.txt')

print 'original:'
pprint(db)
print 'from file:'
pprint(indb)

结果是:

 original:
 [('Bob', ['foo', 'bar', 'baz']),
  ('Jane', ['oof', 'rab', 'zab', 'xuuq']),
  ('Rudy', ['some', 'data'])]
 from file:
 [('Bob', ['foo', 'bar', 'baz']),
  ('Jane', ['oof', 'rab', 'zab', 'xuuq']),
  ('Rudy', ['some', 'data'])]

而db.txt看起来像:

Bob: [foo,bar,baz]
Jane: [oof,rab,zab,xuuq]
Rudy: [some,data]

撰写回答