将文件解析为列表列表

时间:2011-09-07 15:05:25

标签: python parsing

我有这样的文本文件

{ a 3 56 cd 8 }
{ 1 2 3 4 ab 546 }

我目前正在使用以下行将其解析为列表

for line in filename.readlines():
    line = line.lstrip('{').rstrip('}\n').strip(' ').split(' ')

这是最好的方法吗? 因为我听过有人说分割函数应该很少使用,因为它会大大减慢脚本速度。

修改: 我希望输出为:

[[a,3,56,'cd',8],[1,2,3,4,'ab',546]]

4 个答案:

答案 0 :(得分:1)

假设在开始前和结束括号之后没有空格:

li = [line[1:-1].split() for line in file]

或者如果我不能认为:

li = [line.strip()[1:-1].split() for line in file]

答案 1 :(得分:0)

最好使用csv模块之类的模块来解析文件。这是一个示例代码。

# Your file contents - test.csv
{ 1 2 3 asd 4 5 6 }
{ 5 6 7 8 def 8 9 }

>>> import csv
>>> reader = csv.reader(open('test.csv', 'rb'), delimiter=' ')
>>> all_lines = []
>>> for line in reader:
>>>     # if the braces are always in the first and last positions
>>>     # you can just do this
>>>     all_lines.append(line[1:-1])
>>> 
>>> all_lines
[['1', '2', '3', 'asd', '4', '5', '6'], ['5', '6', '7', '8', 'def', '8', '9']]

请注意,列表将包含数字作为字符串。如果需要,可以在追加之前将它们转换为数字格式。

答案 2 :(得分:0)

使用列表理解:

[ [ c for c in l.split() if c not in ('{', '}') ] for l in filename.readlines() ]

如果你想避免split你可以使用正则表达式,不知道它会如何表现更好:

import re
[ re.findall("\w+", l) for l in filename.readlines() ]

答案 3 :(得分:0)

我会使用一个剥离程序:

L = []
for line in file:
    values = line.strip('{}\n\r ').split(' ')
    L.append(values)

它假设您的值没有“{}”。它也适用于Windows(因为Windows上的换行符\ n除了\ n之外)。

如果使用了多个split函数,则每一步都会在内存中创建大量临时对象(因为string是不可变的)。

我怀疑,除了使用split之外还有更快的解决方案。

此外,不需要使用filename.readlines()的文件来混淆内存。使用for line in file可以完美地逐行阅读,也可以将file_object命名为'file_name',因为它们并不完全相同。

slicingstring[1:-1])有一些解决方案。需要进行一些测试以确定此方法是否比仅使用strip更快。