从Python(可能是熊猫)中的文件中读取数组时,一种处理和跳过第一行(包含元数据)的好方法吗?

时间:2018-09-04 10:21:04

标签: python arrays pandas numpy import

假设我有一个像这样的文件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解决方案。 [请注意,理想情况下,一种能够处理和跳过多个元数据行的解决方案将是完美的]

3 个答案:

答案 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()