Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将从文件读取的字符串转换为数组或列表_Python - Fatal编程技术网

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

Python 将从文件读取的字符串转换为数组或列表,python,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_

我有一个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
一旦文本行被读取,我需要一种机制将文本行转换回数组

谢谢

巴维斯

编辑-1:

根据下面给出的建议,我已将文件格式更改为使用逗号分隔的文件

set([8, 6, 7]),
set([8, 5, 7]),
set([8, 4, 7]),
set([8, 3, 7]),

您可以将此应用于文件中的每一行:

>>> 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版本。
但是,如果您能够访问生成当前输出的代码,问题将大大简化。如果是这样的话,它将更有效地保存或保存您的数据。通过这种方式,您只需通过pickle或json加载生成的输出即可恢复列表集。您的文件似乎包含格式正确的python代码。您可以使用以下选项: 将文件的每一行读入一个变量m

>>> m = "set([1, 3, 2])"
>>> eval(m)
set([1, 2, 3])
>>> 

eval被认为是非常危险的,因为它会做任何你要求它做的事情,比如重新格式化你的磁盘或者其他什么。但是,既然您知道文件中要计算的内容,那么这可能就是您的方法。

如果您只想在文件中读取和写入简单的整数列表:

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])]

为什么不将数据序列化为可以轻松从字符串反序列化的格式?
非常适合这里

你是说这个文件有那样的语法吗?我和@Makoto一样担心。您应该使用CSV格式的文本,每组一行。他们有一个完整的模块专门使用这种格式,所以你知道它一定很好@Makoto,是的,文件格式目前没有逗号分隔。我可以尝试将文件用逗号分隔。集合是否只包含整数,或者是否也可以包含浮点数?@ekhumoro,对于数字,文件仅包含整数,不包含任何浮点数。我觉得这种解决方案在解析集合时近乎于过度。你不妨用象枪猎杀松鼠。你有什么建议?如果问题仍然如前所述,那么这不是关于解析集,而是关于解析包含该文本集的文本。那是完全不同的事情。您可以使用eval,但这不是一个好主意。如果您建议不首先将集合的_repr______)结果存储在文本文件中,我将不胜感激。答案是有效的,它回答了老年退休金计划的问题…从定义上来说,这是一个完美的答案…但是有没有其他的方法?我推荐了一种CSV方法,但我只能对此发表评论。你应该非常小心,正如OP所说:我有python代码。。。。因此,如果你不完全确定你从某处得到的代码在做什么,不要使用eval来解析它的结果。-1抱歉,这是一个建议,不是对帖子的回答。它属于评论。好的,利亚姆·尼尔森,非常开朗。所以你认为这是一个不好的建议,最好误导提出问题的人?这是一个设计问题,如果这个想法被拒绝,不需要过多地阐述。我对JSON没有什么特别的反对意见……但是,如果我所有的答案都说为什么你不雇佣人来为你修复它,我会被否决?。从技术上讲,这是一个答案……但它并没有解决问题。我已经给出了一个明确的方向,为什么你要用荒谬的比喻来嘲弄我的话?这是侮辱。你最好对学习计算机科学过于热心;显然,我要将一些Python集序列化为CSV文件!两者都以逗号分隔。说真的,这很有趣。我认为json非常适合。我会对这一评论投赞成票。