如何将元组列表写入文本文件并将其读回原始列表格式?
我的代码给出了:
["(50, 'AAA')\n", "(40, 'BBB')\n", "(30, 'CCC')\n", "(20, 'DDD')\n", "(10, 'EEE')\n"]
我的代码:
file = open("x.txt", "w")
default_scores = [(10, "EEE"), (20, "DDD"), (30, "CCC"), (40, "BBB"), \
(50, "AAA")]
default_scores.sort(reverse=True)
default_score_strings = []
for entry in default_scores:
default_score_strings.append(str(entry) + "\n")
file.writelines(default_score_strings)
file.close()
file = open("x.txt", "r")
lines = file.readlines()
file.close()
print(lines)
答案 0 :(得分:6)
如果要将数据结构写入文件并将其取回(不将其与其他内容混合),可以使用{de}序列化pickle:
import pickle
pickle.dump(default_scores, open('tuple.dump', 'wb'))
retreived_default_scores = pickle.load(open('tuple.dump', 'rb'))
<强>更新强> 如果这是不期望酸洗的挑战,那么可以这样做:
import ast
ds=[(10, "EEE"), (20, "DDD"), (30, "CCC"), (40, "BBB"), \
(50, "AAA")]
fname = 'practice.txt'
with open(fname, 'w') as f:
f.write(str(ds))
with open(fname, 'r') as f:
retreived_ds = ast.literal_eval(f.read())
print(ds == retreived_ds)# True
进一步更新:
OP评论暗示这是初学者字符串处理中的一个练习题,不允许使用像pickle这样的工具。然后,eval
语句也是如此。在那种情况下:
ds=[(10, "EEE"), (20, "DDD"), (30, "CCC"), (40, "BBB"), \
(50, "AAA")]
fname = 'practices.txt'
with open(fname, 'w') as f:
f.write(str(ds))
with open(fname, 'r') as f:
ds_string = f.read()
retreived_ds = []
i = 0
ds_string = ds_string.strip()[1:-1]
while(i < len(ds_string)):
if ds_string[i] == '(':
end_index = ds_string[i+1:].index(')') + i
first, second = ds_string[i+1: end_index].split(',')
retreived_ds.append((int(first), second.strip().replace("'", "")))
i = end_index + 1
i = i + 1
print(retreived_ds == ds)#True
答案 1 :(得分:2)
您可以使用列表推导将file.readlines()返回的列表转换为元组列表 -
对于file.readlines()中的行,lines = [ast.literal_eval(line.strip())
我已经使用ast.literal_eval将字符串转换为元组。 阅读更多关于ast.literal_eval here
的信息这是完整的代码 -
import ast
file = open("x.txt", "w")
default_scores = [(10, "EEE"), (20, "DDD"), (30, "CCC"), (40, "BBB"), \
(50, "AAA")]
default_scores.sort(reverse=True)
default_score_strings = []
for entry in default_scores:
default_score_strings.append(str(entry) + "\n")
file.writelines(default_score_strings)
file.close()
file = open("x.txt", "r")
lines = [ast.literal_eval(line.strip()) for line in file.readlines()]
file.close()
print(lines)
答案 2 :(得分:2)
如果它是一个仅在程序内部用于存储以后检索数据的文件,则可以使用更简单的方法:
# Save data to disk
with open("mydata.dat", "w") as f:
f.write(repr(data))
...
# Read back from disk
with open("mydata.dat") as f:
data = eval(f.read())
这将很好地处理由列表,元组,字典,字符串,数字,bool组成的许多Python任意数据结构......假设数据结构只是树状(没有循环或共享)。这种方法的优点是文件是人类可读的形式,您可以轻松地手动编辑内容(它只是Python语法)。
对于树状数据结构,我们也很容易使用json
模块,它具有以可手动编辑的格式写入/读取的附加优势,对于该模块,基本上任何语言都有支持库允许在Python,Java,Javascript,C ++,C#和您的名字之间轻松交换数据。代码是:
# save
with open("mydata.json", "w") as f:
f.write(json.dumps(data))
...
# load
with open("mydata.json") as f:
data = json.loads(f.read())
对于支持内部引用(循环和共享数据)和用户定义类的更一般方法,您可以使用标准模块pickle
(但结果不能手动编辑)。
请注意,如果输入文件来自不受信任的来源,那么您应该使用不同的方法eval
,pickle
和其他现成的库函数(可能json
除外)是不是为了能够阻止敌对攻击。
答案 3 :(得分:1)
似乎json适合任务:
default_scores = [(10, "EEE"), (20, "DDD"), (30, "CCC"), (40, "BBB"), (50, "AAA")]
import json
with open('scores.txt','w') as ff:
json.dump(default_scores ,ff )
with open('scores.txt','r') as ff:
scores = json.load(ff)
print(scores)
# should print : [[10, 'EEE'], [20, 'DDD'], [30, 'CCC'], [40, 'BBB'], [50, 'AAA']]
答案 4 :(得分:0)
如果你的目的是读取没有换行符的行,你可以在用简单的for循环读取行后改变它:
lines = file.readlines()
lines = [line[:-1] for line in lines]
当然,您可以使用str.splitlines
读取文件并拆分行:
lines = file.read().splitlines()
答案 5 :(得分:0)
只需删除'\ n'字符并将所有内容附加到新列表中
x = []
for i in lines:
i = i.replace("\n","")
x.append(i)
lines = x