我正在制作一个将某些数据存储在txt文件中的程序。我这样做是有效的,但我想把它改成列表,所以用list.remove和list.append编辑内容更容易......这是我制作的格式:
Username:data1:data2:data3:data++
我想要实现的目标是:
Username:[data1, data2, data3, data++]
为什么我要这个?
因为编辑数据用"分隔:"不是" Pythonic方式"要做到这一点,所以我想将它们转换为列表...
我使用此过滤器得到某些行:
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]& #34;并获取数据列表,我可以使用list.append和list.remove编辑...
感谢您的阅读/回答! :)
答案 0 :(得分:1)
虽然我认为我已经回答了你的问题(见下面的代码),但我有一些评论:
在文本文件中使用冒号作为分隔符不是'unpythonic';那不是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]
答案 1 :(得分:0)
我认为您应该阅读有关ConfigParser https://docs.python.org/2/library/configparser.html的信息。这个库可以解决您的阅读和写作问题。您可以在此处阅读有关在ConfigParser中使用列表的更多信息 - > Lists in ConfigParser
答案 2 :(得分:0)
您可以使用pickle或pyyaml将对象存储在文本文件中。使用泡菜的例子:
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')))
答案 3 :(得分:0)
据此编辑:
list = [data1, data2, data3, data++]
file = open("file.txt", "w")
file.write("Username: " + str(list))
file.close
答案 4 :(得分: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)