将从文件读取的字符串转换为数组或列表

时间:2011-12-27 22:25:52

标签: python

我有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]),

4 个答案:

答案 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版本 但是,如果您可以访问生成当前输出的代码,则问题将大大简化。如果是这种情况,那么picklingjsoning您的数据会更有效。通过这种方式,您可以简单地通过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非常适合这里。