将文本文件的行拆分为元组-Python的一部分

时间:2012-04-09 05:42:32

标签: python split tuples

我正在开发一个汇编程序并选择使用Python而不是C(主要是因为Python可以用列表做什么,我想学习它)

我的问题是如何将文本文件的每一行拆分为元组的一部分?

例如,测试文件是:

ADD R1,R2;  
OR R1,R3;

并有代码将其解析为此

UserProgram=[['ADD','R1','R2'],['OR','R1','R3']]

分号后也必须忽略注释。谢谢!

5 个答案:

答案 0 :(得分:2)

>>> s = "ADD R1,R2; OR R1,R3;"
>>> t1 = s.split(';')
>>> t1
['ADD R1,R2', ' OR R1,R3', '']
>>> UserProgram = [t.strip().replace(',', ' ').split(' ') for t in t1 if len(t) > 0]
>>> UserProgram
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]
>>> 

顺便说一句,方括号表示列表,而不是元组。

答案 1 :(得分:1)

>>> import re
>>> [re.split('\W+', s.strip()) for s in 'ADD R1,R2; OR R1,R3;'.split(';') if s]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]

<强> UPD:

python -m timeit -s "import re; regexp = re.compile('\W+');" "[regexp.split(s.strip()) for s in 'ADD R1,R2; OR R1,R3;'.split(';') if s]"
100000 loops, best of 3: 3.34 usec per loop

python -m timeit "[t.strip().replace(',', ' ').split(' ') for t in 'ADD R1,R2; OR R1,R3;'.split(';') if t]"100000 loops, best of 3: 2.1 usec per loop

顺便说一句,我的变体并不坏,虽然有点慢

答案 2 :(得分:1)

如果你的来源是这种格式

source="""
ADD R1,R2;
OR R1,R3;
"""

然后你可以简单地通过splitlines()线性分割源,然后再用;拆分作为分隔符,丢弃';'之后的任何内容。

sourcelines=[x.split(";")[0].replace(',',' ').split() 
             for x in source.splitlines() if x]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]

您还可以继续前进并将每个ASM源代码行拆分为OP代码和单个操作数。

[[token.split(',') for token in x.split(";")[0].split()] 
  for x in source.splitlines() if x]

你会得到像

这样的东西
[[['ADD'], ['R1', 'R2']], [['OR'], ['R1', 'R3']]]

答案 3 :(得分:1)

所以我们有一个这种格式的源文件。

我们需要文件中每行的标记列表。

令牌是在第一个分号后切掉所有内容的结果,并将其余部分分成逗号或空格。我们可以通过用空格替换逗号,然后只是在空格上拆分来实现。

所以我们转向标准库。当你没有给它分割的东西时,split字符串的方法在空格上分裂。 replace方法允许我们将一个子字符串替换为另一个子字符串(例如,','替换为' ')。要在分号后删除所有内容,我们可以partition并获取第一部分(结果的元素0)。*单个行的处理因此看起来像

line.partition(';')[0].replace(',', ' ').split()

然后我们只是为文件的每一行执行此操作。为了获得将某个函数应用于源元素的结果列表,我们可以使用列表推导直接请求它(基本上我们描述了结果列表应该是什么样子)。 Python中的文件对象是有效的行源;你可以迭代它(这个概念可能对C ++程序员来说更熟悉),元素是文件的行。

所以我们需要做的就是打开文件(我们将惯用with块来管理文件)并生成列表:

with open('asm.s') as source:
    parsed = [
        line.partition(';')[0].replace(',', ' ').split()
        for line in source
    ]

完成。

*或再次使用split,但我发现当生成元素列表实际上不是你的目标时,这一点就不太清楚了。

答案 4 :(得分:0)

>>>s = "ADD R1,R2; OR R1,R3;"
>>>[substr.split() for substr in s.replace(',',' ').split(';')[:-1]]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]