Je lis un fichier .dat depuis un serveur de fichiers Samba contenant des données de capteur de vent. Ce fichier contient un en-tête avec quelques informations (lignes 1, 3 et 4), une ligne avec les noms des capteurs (2ème ligne), et la lecture des capteurs sur le corps (144 lignes, 1 ligne toutes les 10 minutes), comme ceci :
array[lines.index(line)] = line.split(',') IndexError: list assignment index out of range
Mon objectif est de convertir le texte brut en tableau (donc par exemple, je sais que toutes les valeurs de la colonne 4 appartiennent au capteur Barometer1).
J'ai réussi à faire un script PHP qui fonctionne, j'ai lu tous les fichiers jusqu'à la fin du fichier, les ajouter à une chaîne, exploser avec le délimiteur EOL (tableau de résultats de lignes), puis enfin exploser avec ',' ( virgule) délimiteur (tableau de tableau?)
data = file_obj.read() file_obj.close() lines = data.split('\n') array = [] for line in lines: array[lines.index(line)] = line.split(',')
Ensuite, je parcourt $ array [$ row] [$ col], fais une liste pour chaque type de capteur et insère chacun liste sur la table de base de données respective.
Mais j'ai besoin de cela pour fonctionner avec le script python , donc j'ai essayé
$data = ''; while (!feof($stream)) { $data .= fread($stream, 8192); } $lines = explode(PHP_EOL, $data); foreach ($lines as $line) { $array[] = explode(",", $line); }
Impression data sur le terminal renvoie le texte intégral sous forme de chaîne, l'impression de lignes sur le terminal renvoie chaque ligne (ex: print (lines [1])) tandis que array erreur de retour
"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...
Utilisation de pysmb bibliothèque pour obtenir file_obj à partir du partage samba
3 Réponses :
Pour cela, il est préférable d'utiliser la bibliothèque pandas python pour organiser les données dans un dataframe.
par exemple
import pandas as pd pd.read_csv('yourfile.dat', header=None, sep='\s\s+', engine='python')
Im en train d'apprendre sur les pandas maintenant. Cette bibliothèque peut m'aider à insérer des données dans la base de données? Si non, il y a une raison pour laquelle j'ajoute une autre couche de programme? Je demande cela, car dans ma tête, ma tâche est: lire le fichier> organiser les lignes du tableau en listes (ex: anemometer1List = ['2019-06-19 00:10:00' => 10.76701, '2019-06-19 00 : 20: 00 '=> 9.991986] ...),> insérer la liste dans la base de données. Si j'utilise des pandas, je devrais lire le fichier> organiser les données> insérer dans le cadre de données pandas> insérer le cadre de données dans la base de données
Oui, vous pouvez insérer directement df dans une base de données. Vous pouvez google selon votre base de données. par exemple df.to_sql ('table', moteur, if_exists = 'replace')
Une autre solution consiste à transformer vos lignes en listes et à les ajouter à un dataframe:
import pandas as pd list=[["DataFormat","Anemometric tower","Datalogger","SomeCode","LoggerOS","LoggerFileSystem","AnotherCode","Table1"]] df=pd.DataFrame(list,columns=['col1'])
Afin de programmer une logique similaire (à la fois php et python), j'ai réussi à la faire fonctionner en utilisant ajouter
Mais, comme les gens l'ont mentionné, la bibliothèque panda peut également aider.
data = file_obj.read() file_obj.close() lines = data.split('\n') array = [] for line in lines: array.append(line.split(','))