Python 通过读取文本文件返回列表

Python 通过读取文本文件返回列表,python,Python,我正在读取一个由空格分隔的文本文件,该文件如下所示: 第一行:你好,2928977[1.2,9.7] 第二行:苹果6723547[8.2,3.1] 我想返回一个类似于[hello,1.2,9.7,apple,8.2,3.1,…]的列表 我该怎么做? 我知道第一步是设置一个空列表,然后 output =[] inputfile = open('text.txt','r') for eachline in inputfile: l=line.stri

我正在读取一个由空格分隔的文本文件,该文件如下所示:

第一行:你好,2928977[1.2,9.7]

第二行:苹果6723547[8.2,3.1]

我想返回一个类似于[hello,1.2,9.7,apple,8.2,3.1,…]的列表 我该怎么做? 我知道第一步是设置一个空列表,然后

    output =[]
    inputfile = open('text.txt','r')
    for eachline in inputfile:
            l=line.strip()
            s=l.split(',')
            output.append((s[0],float(s[2][0]),float(s[2][1]))
    return output
但这不起作用。。。上面写着无效的语法…有人能帮我吗?
我也用这个方法尝试了另一个文件,但它说字符串不能转换成float。。。我不能让这个工作,我会非常感谢你的帮助!谢谢

看起来您正试图在列表中获取元组

output_list = []

with open('answer.txt', 'r') as f:
    data = f.read().rstrip('\n')
    for line in data.split('\n'):
    line_updated = line.strip("[").strip(']').split(' ')
    required_elements = line_updated[0], line_updated[2]

    output_list.append(required_elements)

print('\n',output_list)

[('hello', '1.2,9.7'), ('apple', '8.2,3.1')]

我通常会使用正则表达式进行这种模式匹配,以确保[…]中的元素是数字。 但要继续你正在做的事情:

#s='hello 2928977 [1.2,9.7]\napple 6723547 [8.2,3.1]\n'
#sp=s.splitlines()
with open(filename, "rb") as f:
    sp=f.readlines()

output=[]
for p in sp:
    words = p.split(" ")
    x,y=[float(x) for  x in words[2].strip("[|]").split(",")]
    output.append((words[0], x,y ) )
print(output)

狭义地处理无效语法,计算括号,两个括号都打开:

output.append((s[0],float(s[2][0]),float(s[2][1]))
             ^^          ^              ^
并关闭:

output.append((s[0],float(s[2][0]),float(s[2][1]))
                                 ^              ^^
看到问题了吗?当你在一行上看到一个语法错误,而它毫无意义时,寻找从前一行开始的不匹配的括号、括号等;错误通常发生是因为不匹配后的下一行被解释为前一行的一部分,当然它在语法上是无效的

由“”而不是“,”拆分 ast.literal_求值字符串“[1.2,9.7]”以获取列表[1.2,9.7] 首先,您应该告诉我们哪一行出现了无效语法。它可能由制表符、空格或其他原因引起

其次,您可以打印s[2][0]和s[2][1]。 我想可能是这样的:

[8.2和3.1],因此不能将其转换为浮动

您可以这样修改它: output.appends[0],float[2][0][1:,float[2][1][:-1]

readlines通过列表将整个文件存储到内存中,在这里不实用。@Vincenzzochi您从哪里知道这是不实用的?readlines的存在是有原因的——在某些情况下,将其加载到内存中是完全可以接受的,例如当文件很小时。您正在循环一个文件,以创建一个要再次循环的数据结构。只有当您需要多次访问同一文件内容,并且您有足够的内存时,readlines才是实用的。这是一种不好的做法,在这里是不切实际的。我加了括号,但现在它说的是退出function@joe:你有功能吗?我以为你只发布了一个片段,但如果这就是全部代码,那当然是错的。返回仅在函数内部有意义;如果这是在顶层,你可以打印到屏幕或写入文件或其他任何东西,但没有地方可以返回。是的。。。我忘了把我的功能放进去。。但现在它给出了一个错误:列表索引超出了范围请不要建议使用eval作为实现这一点的合法方法。可以使用ast.literal_eval和json.loads高效、安全地执行此操作,eval只是自找麻烦。按照建议进行编辑。它是eval的安全版本,用于解析字符串并返回值。它避免执行危险代码。eval1和ast.literal_eval1都返回1。evalprint1执行代码,而ast.literal\u evalprint1将引发异常。最重要的是,ast.literal\u eval'\u import\u shutil.rmtree/'在遇到权限错误之前不会开始删除磁盘上的所有文件。eval在这方面更有用。我知道第一个代码是错误的,所以必须运行一次以进行更改。当没有答案时,我尽我所能让OP知道答案就在眼前。我不认为你需要嘲笑我或者其他人。每个人都在学习。谢谢
from ast import literal_eval

output = []
with open('text.txt', 'r') as inputfile:
    for eachline in inputfile:
        l = eachline.strip()
        s = l.split(' ')
        ls = literal_eval(s[2])
        output.append((s[0], ls[0], ls[1]))
print(output)
# [('hello', 1.2, 9.7), ('apple', 8.2, 3.1)]