Python将行拆分为单独的列表

时间:2013-12-22 18:47:22

标签: python

我在文本文件中有数据,空间分隔为右对齐列。我希望能够将每个列放入列表中,基本上就像使用数组一样。我似乎无法找到等同于

left(strname,#ofcharacters)/mid(strname,firstcharacter,lastcharacter)/right(strname,#ofcharacters)
像你通常在VB中用来完成任务一样。我如何分离数据并将每个像'unit'的值放在Python下一行的下一行。

有可能吗?哦是的,一些间距是12个字符(右对齐),而其他间距是15个字符。

-1234      56    32452      68584.4   Extra_data
-5356       9      546      12434.5   Extra_data
-  90      12     2345      43522.1   Extra_data

期望的输出:

[-1234, -5356, -90]
[56, 9, 12]
[32452, 546, 2345]
etc

2 个答案:

答案 0 :(得分:0)

你正在寻找的python中的等价方法是str.split(),没有任何参数来分隔空格上的字符串。它还将处理任何尾随的换行符/空格,并且在VB示例中,您不需要关心数据宽度。

示例

with open("data.txt") as fin:
    data = map(str.split, fin) #Split each line of data on white-spaces
    data = zip(*data) #Transpose the Data

但是如果您有包含空格的列,则需要根据列位置拆分数据

>>> def split_on_width(data, pos):
    if pos[-1] != len(data):
        pos = pos + (len(data), )
    indexes = zip(pos, pos[1:]) #Create an index pair with current start and
                                #end as next start
    return [data[start: end].strip() for start, end in indexes] #Slice the data using
                                                                #the indexes

>>> def trynum(n):
    try:
        return int(n)
    except ValueError:
        pass
    try:
        return float(n)
    except ValueError:
        return n


>>> pos
(0, 5, 13, 22, 36)
>>> with open("test.txt") as fin:
    data = (split_on_width(data.strip(), pos) for data in fin)
    data = [[trynum(n) for n in row] for row in  zip(*data)]       


>>> data
[[-1234, -5356, -90], [56, 9, 12], [32452, 546, 2345], [68584.4, 12434.5, 43522.1], ['Extra_data', 'Extra_data', 'Extra_data']]

答案 1 :(得分:0)

只使用没有参数的str.split();它将输入字符串拆分为任意宽度的空格:

>>> '  some_value    another_column    123.45       42  \n'.split()
['some_value', 'another_column', '123.45', '42']

请注意,任何包含空格的列也会被拆分。

如果您想要的列表,则需要转置行:

with open(filename) as inputfh:
    columns = zip(*(l.split() for l in inputfh))