我有一条记录,如下:
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中分隔休息记录?
答案 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]
当外部列表包含A
,B
等并且内部列表包含与A
,B
相关的数字时,这将产生一个列表列表等
此代码假定您对以任何单个字母开头(不区分大小写)的行感兴趣。 有关更详细的条件,您可能需要研究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()
如其他答案中所建议。如果第一个标记不是单个字符,这将更好地推广。