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