Я читаю файл .dat с файлового сервера samba, который содержит некоторые данные датчика ветра. Этот файл содержит заголовок с некоторой информацией (строки 1,3 и 4), строку с названиями датчиков (2-я строка) и показания датчиков на теле (144 строки, 1 строка каждые 10 минут), например :
"DataFormat","Anemometric tower","Datalogger","SomeCode","LoggerOS","LoggerFileSystem","AnotherCode","Table1"
"TIMESTAMP","RECORD","Precipit1","Barometer1","Temperature1","Humidity1","Anemometer1","Windvane1","Anemometer2","Windvane2","Battery1"
"TS","RN","","hPa","C. Deg","%RH","m/s","Deg","m/s","Deg","Volts"
"","","Smp","Avg","Avg","Avg","Avg","Avg","Avg","Avg","Avg"
"2019-06-19 00:10:00",1211,"NAN",921.014,19.57733,98.29526,10.76701,137.6863,10.68348,139.7062,11.91,
"2019-06-19 00:20:00",1212,"NAN",920.9402,19.44474,98.67733,9.991986,141.5792,9.892648,143.3559,11.35
"2019-06-19 00:30:00",1213,"NAN",920.6142,19.45635,99.00026,10.80979,148.0094,10.63116,150.0893,11.41
...more 141 lines...
Моя цель - преобразовать необработанный текст в таблицу (например, я знаю, что все значения из столбца 4 принадлежат датчику Barometer1).
Мне удалось сделать PHP-скрипт, который работает, я читаю весь файл до конца файла, добавляю к строке, взорваюсь с разделителем EOL (результирующий массив строк), затем, наконец, взрываюсь с разделителем ',' (запятая) (массив массива ?)
$data = '';
while (!feof($stream)) {
$data .= fread($stream, 8192);
}
$lines = explode(PHP_EOL, $data);
foreach ($lines as $line) {
$array[] = explode(",", $line);
}
Затем я перебираю $array[$row][$col], составляю список для каждого типа датчика и вставляю каждый список в соответствующую таблицу базы данных.
Но мне это нужно для работы со скриптом питон, поэтому я попробовал
data = file_obj.read()
file_obj.close()
lines = data.split('\n')
array = []
for line in lines:
array[lines.index(line)] = line.split(',')
Печать данные на терминале возвращает полный текст в строке, печать линии на терминале возвращает каждую строку (например: print(lines[1])), а множество возвращает ошибку
array[lines.index(line)] = line.split(',')
IndexError: list assignment index out of range
Работа с библиотекой писмб для получения file_obj из общего ресурса samba






Для этой цели лучше использовать библиотеку python pandas для организации данных в фрейме данных.
например
import pandas as pd
pd.read_csv('yourfile.dat',
header=None, sep='\s\s+', engine='python')
Да, вы можете напрямую вставить df в базу данных. Можно погуглить по своей базе. например df.to_sql('table', engine, if_exists='replace')
Альтернативное решение состоит в том, чтобы превратить ваши строки в списки и добавить их в фрейм данных:
import pandas as pd
list=[["DataFormat","Anemometric tower","Datalogger","SomeCode","LoggerOS","LoggerFileSystem","AnotherCode","Table1"]]
df=pd.DataFrame(list,columns=['col1'])
Чтобы запрограммировать подобную логику (как на php, так и на python), мне удалось заставить ее работать с помощью добавить функция.
Но, как уже упоминалось, библиотека панды также может помочь.
data = file_obj.read()
file_obj.close()
lines = data.split('\n')
array = []
for line in lines:
array.append(line.split(','))
Я сейчас узнаю о пандах. Эта библиотека может помочь мне вставить данные в базу данных? Если нет, то зачем мне добавлять в него еще один программный слой? Я спрашиваю это, потому что в моей голове моя задача: прочитать файл > организовать строки таблицы в списки (например: anemometer1List= ['2019-06-19 00:10:00' => 10.76701, '2019-06-19 00 :20:00' => 9.991986]...), > вставить список в базу данных. Если я использую pandas, я должен прочитать файл> организовать данные> вставить в фрейм данных pandas> вставить фрейм данных в базу данных