我有python代码生成数组作为数组并将它们存储在一个文件中,该文件如下所示
set([0, 2, 3])
set([0, 1, 3])
set([0, 1, 2])
我有另一个python代码读取此文件,需要将文本行转换回数组。
读取文件的方法
def get_sets_from_file (self,file_name):
file_handle = open(file_name, "r")
all_sets_from_file = file_handle.read()
print all_sets_from_file
读取文本行后,我需要一个机制来将文本行转换回数组。
谢谢,
Bhavesh。
EDIT-1:
根据以下建议,我已将文件格式更改为使用逗号分隔文件
set([8, 6, 7]),
set([8, 5, 7]),
set([8, 4, 7]),
set([8, 3, 7]),
答案 0 :(得分:1)
您可以将其应用于文件中的每一行:
>>> line = "set([0, 2, 3])" #or "set([0, 2, 3]),"
>>> import re
>>> r = "set\(\[(.*)\]\)"
>>> m = re.search(r, line)
>>> match = m.group(1)
>>> a = [int(item.strip()) for item in match.split(',')]
>>> a
[0, 2, 3]
>>>
可以在您的代码中实现:
def get_sets_from_file (self,file_name):
total = []
with open(file_name, "r") as fhdl:
for line in fhdl:
a = do_the_regex_thing_above
total.append(a)
return total
编辑(根据@Droogans的评论):
正如您在新编辑中描述的那样,此代码将完美地工作,而不会更改文档的csv版本
但是,如果您可以访问生成当前输出的代码,则问题将大大简化。如果是这种情况,那么pickling或jsoning您的数据会更有效。通过这种方式,您可以简单地通过pickle或json加载生成的输出来恢复您的列表集
答案 1 :(得分:0)
看起来你的文件包含正确形成的python代码。你可以用这个: 将文件的每一行读入变量(m)
>>> m = "set([1, 3, 2])"
>>> eval(m)
set([1, 2, 3])
>>>
eval被认为非常危险,因为它可以执行您要求的任何操作(例如重新格式化磁盘或其他内容)。但是既然您知道要评估的文件中的内容,这可能就是您的选择。
答案 2 :(得分:0)
如果您只想从文件中读取和写入简单的整数列表:
import os
sets = [
set([0, 2, 3]),
set([0, 1, 3]),
set([0, 1, 2]),
]
def write_sets(path, sets):
with open(path, 'wb') as stream:
for item in sets:
item = ' '.join(str(number) for number in item)
stream.write(item + os.linesep)
def read_sets(path, sets):
sets = []
with open(path, 'rb') as stream:
for line in stream:
sets.append(set(int(number) for number in line.split()))
return sets
path = 'tmp/sets.txt'
write_sets(path, sets)
print read_sets(path, sets)
# [set([0, 2, 3]), set([0, 1, 3]), set([0, 1, 2])]
答案 3 :(得分:-2)
为什么不将数据序列化为可以从字符串中轻松反序列化的内容? JSON非常适合这里。