将元组列表写入文本文件并读回列表

时间:2016-08-02 05:50:09

标签: python tuples text-files

如何将元组列表写入文本文件并将其读回原始列表格式?

我的代码给出了:

["(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)

6 个答案:

答案 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(但结果不能手动编辑)。

请注意,如果输入文件来自不受信任的来源,那么您应该使用不同的方法evalpickle和其他现成的库函数(可能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