假设我有一个像这样的文件bla.txt
:
21 27 268 288
55.1 21.2 25.5 23.5 22.3 20.8
28.3 27.1 27.2 26. 25. 23.1
29.8 28.3 29.0 28.6 27.2 24.4
第一行包含我想稍后在脚本中使用的元数据(下面的脚本中的a, b, c, d
),然后其余部分是易于阅读的纯数组。
有没有一种方法可以在读取数组时在跳过第一行的同时对其进行处理?
换句话说,如何以更优雅/ pythonic的方式执行以下操作?
import numpy as np
fname = 'bla.txt'
with open(fname) as f:
lines = f.readlines()
a, b, c, d = [float(x) for x in lines[0].split()]
myarray = np.loadtxt(fname, skiprows=1)
编辑:
欢迎使用pandas
解决方案。
[请注意,理想情况下,一种能够处理和跳过多个元数据行的解决方案将是完美的]
答案 0 :(得分:2)
您可以告诉numpy.loadtxt
跳过行。
>>> import numpy as np
>>> np.loadtxt('bla.txt', skiprows=1)
array([[55.1, 21.2, 25.5, 23.5, 22.3, 20.8],
[28.3, 27.1, 27.2, 26. , 25. , 23.1],
[29.8, 28.3, 29. , 28.6, 27.2, 24.4]])
您可以使用
获取任何不带numpy的文件的第一行>>> with open('bla.txt') as f:
... line1 = next(f)
...
>>> line1
' 21 27 268 288 \n'
如果标题行没有缺失值,您也可以使用loadtxt
读取整个文件,然后将数组切成数据和标题部分。
您没有为其添加标签,但为方便起见,我建议您使用pandas
。
>>> import pandas as pd
>>> df = pd.read_csv('bla.txt', delim_whitespace=True)
>>> line1 = list(df.columns)
>>> data = df.reset_index().values
>>>
>>> line1
['21', '27', '268', '288']
>>> data
array([[55.1, 21.2, 25.5, 23.5, 22.3, 20.8],
[28.3, 27.1, 27.2, 26. , 25. , 23.1],
[29.8, 28.3, 29. , 28.6, 27.2, 24.4]])
答案 1 :(得分:1)
文件是其行上的迭代器,因此您可以使用 NotificationChannel reminderChannel = new NotificationChannel(<id>,
context.getString(R.string.id), NotificationManager.IMPORTANCE_HIGH);
reminderChannel.setDescription(context.getString(R.string.desc));
reminderChannel.enableLights(true);
reminderChannel.enableVibration(true);
// Creating an Audio Attribute
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
Uri alarmSound;
alarmSound = Uri.parse("android.resource://" + HealthifymeApp.getInstance().getPackageName() + "/" + R.raw.reminder_notification);
reminderChannel.setSound(alarmSound, audioAttributes);
mNotificationManager.createNotificationChannel(reminderChannel);
获取第一行并将迭代器指针移至第二行。然后(在next(f)
块中,您可以将打开的文件with
传递到f
,因此它仅从第二行开始读取:
numpy.loadtxt()
答案 2 :(得分:0)
只需lines = f.readlines()[1:]
而不是lines = f.readlines()
。