Python分割数据记录

时间:2018-09-18 09:00:03

标签: python string python-3.x split

我有一条记录,如下:

  

29 16

     

A 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355   0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

     

B 1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103   0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247

我想将数据分成键值对,而忽略第一行,即2916。应该忽略它。

输出应该是这样的: x = A,B

y = 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247

我可以使用以下代码忽略第一行:

f = open(fileName, 'r')
lines = f.readlines()[1:]

现在如何在Python中分隔休息记录?

4 个答案:

答案 0 :(得分:1)

这是我的观点:D我希望您也希望解析数字?

def generate_kv(fileName):
    with open(fileName, 'r') as file:
        # ignore first line
        file.readline()
        for line in file:
            if '' == line.strip():
                # empty line
                continue
            values = line.split(' ')
            try:
                yield values[0], [float(x) for x in values[1:]]
            except ValueError:
                print(f'one of the elements was not a float: {line}')

if __name__ == '__main__':
    x = []
    y = []
    for key, value in generate_kv('sample.txt'):
        x.append(key)
        y.append(value)
    print(x)
    print(y)

假定sample.txt中的值如下所示:

% cat sample.txt 
29 16

A 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

B 1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247

和输出:

% python sample.py
['A', 'B']
[[1.2595034, 0.82587254, 0.7375044, 1.1270138, -0.35065323, 0.55985355, 0.7200067, -0.889543, 0.2300735, 0.56767654, 0.2789483, 0.32296127, -0.6423197, 0.26456305, -0.07363393, -1.0788593], [1.2467299, 0.78651106, 0.4702038, 1.204216, -0.5282698, 0.13987103, 0.5911153, -0.6729466, 0.377103, 0.34090135, 0.3052503, 0.028784657, -0.39129165, 0.079238065, -0.29310825, -0.99383247]]

或者,如果您想要一本字典,请执行以下操作:

if __name__ == '__main__':
    print(dict(generate_kv('sample.txt')))

这会将列表转换成字典并输出:

{'A': [1.2595034, 0.82587254, 0.7375044, 1.1270138, -0.35065323, 0.55985355, 0.7200067, -0.889543, 0.2300735, 0.56767654, 0.2789483, 0.32296127, -0.6423197, 0.26456305, -0.07363393, -1.0788593], 'B': [1.2467299, 0.78651106, 0.4702038, 1.204216, -0.5282698, 0.13987103, 0.5911153, -0.6729466, 0.377103, 0.34090135, 0.3052503, 0.028784657, -0.39129165, 0.079238065, -0.29310825, -0.99383247]}

答案 1 :(得分:0)

如果您乐意将数据存储在字典中,则可以执行以下操作:

records = dict()
with open(filename, 'r') as f:
    f.readline() # skip the first line
    for line in file:
        key, value = line.split(maxsplit=1)
        records[key] = value.split()

records的结构为:

{
    'A': ['1.2595034', '0.82587254', '0.7375044', ... ]
    'B': ['1.2467299', '0.78651106', '0.4702038', ... ]
}

发生了什么

  • with ... as f我们正在上下文管理器more info here)中打开文件。这样,我们就可以在阻止完成后自动关闭文件。
  • 由于打开的文件跟踪文件中的位置,因此我们可以使用f.readline()将指针向下移动一行。 (docs
  • line.split()允许您将字符串转换为字符串列表。使用maxsplits=1 arg意味着它只会在第一个空格处分割。 例如x, y = 'foo bar baz'.split(maxsplit=1)x = 'foo'y = 'bar baz'

答案 2 :(得分:0)

如果文件是文本,则可以使用此脚本

filename='file.text'
with open(filename) as f:
      data = f.readlines()
x=[data[0][0],data[1][0]]
y=[data[0][1:],data[1][1:]]

答案 3 :(得分:0)

如果我理解正确,那么您希望将这些数字收集在列表中。一种方法是:

import string

text = '''
29 16

A 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

B 1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247
'''

lines = text.split('\n')
x = [
    line[1:].strip().split()
    for i, line in enumerate(lines)
    if line and line[0].lower() in string.ascii_letters]

当外部列表包含AB等并且内部列表包含与AB相关的数字时,这将产生一个列表列表等

此代码假定您对以任何单个字母开头(不区分大小写)的行感兴趣。 有关更详细的条件,您可能需要研究regular expressions

很明显,如果您的text在文件中,则可以将lines = ...替换为:

with open(filepath, 'r') as lines:
    x = ...

此外,如果不应该将x中的项目分开,而应将其分隔为字符串,则可能需要用line[1:].strip().split()来更改line[1:].strip()

相反,如果您希望数字为float而不是字符串,则应将line[1:].strip().split()替换为[float(value) for value in line[1:].strip().split()]

编辑:

或者line[1:].strip().split(),您可能想要做:

line.split(maxsplit=1)[1].split()

如其他答案中所建议。如果第一个标记不是单个字符,这将更好地推广。