Ci-dessous est mon morceau de code.

import numpy as np

filename1=open(f)
xf = np.loadtxt(filename1, dtype=float)

Voici mon fichier de données.

0.14200E+02 0.18188E+01 0.44604E-03
0.14300E+02 0.18165E+01 0.45498E-03
0.14400E+02-0.17694E+01 0.44615E+03
0.14500E+02-0.17226E+01 0.43743E+03
0.14600E+02-0.16767E+01 0.42882E+03
0.14700E+02-0.16318E+01 0.42033E+03
0.14800E+02-0.15879E+01 0.41196E+03

Comme on peut le voir, il y a des valeurs négatives qui occupent l'espace entre 2 valeurs, cela donne numpy à donner

ValueError: Wrong number of columns at line 3

Ceci est juste un petit extrait de mon code. Je veux lire ces données en utilisant numpy ou pandas. Toute suggestion serait géniale.

Modifier 1:

@ZarakiKenpachi J'ai utilisé votre suggestion de sep = '| -' mais cela me donne une 4ème colonne supplémentaire avec des valeurs NaN.

Modifier 2:

@Serge Ballesta bonne suggestion mais tout cela est une sorte de prétraitement. Je veux une sorte de fonction inbuild pour le faire dans pandas ou numpy.

Modifier 3:

Remarque importante , il convient de noter qu'il existe également un signe négatif dans 0.4373E-03

Merci

1
WhySoSerious 28 juin 2019 à 11:28

3 réponses

Meilleure réponse

np.loadtext peut lire à partir d'un générateur (chaîne d'octets), vous pouvez donc filtrer le fichier d'entrée tout en le chargeant pour en ajouter un supplémentaire avant un moins:

...
def filter(fd):
    rx = re.compile(rb'\d-')
    for line in fd:
        yield rx.sub(b' -', line)

xf = np.loadtxt(filter(open(f, 'b')), dtype=float)

Cela ne nécessite pas de tout précharger en mémoire, donc il est prévu qu'il soit efficace en mémoire.


Le regex est nécessaire pour éviter de changer quelque chose comme 0.16545E-012.

Dans mes tests pour les lignes 10k, cela devrait être au plus 10% plus lent que le chargement de tout en mémoire mais nécessitera beaucoup moins de mémoire

2
Serge Ballesta 28 juin 2019 à 10:10

Vous pouvez effectuer un prétraitement de vos données pour ajouter un espace supplémentaire avant vos signes -. Bien qu'il existe de nombreuses façons de le faire, la meilleure approche serait à mon avis (afin d'éviter d'ajouter des espaces blancs au début de la ligne) utilise regex re.sub:

import re

with open(f) as file:
    raw_data = file.readlines()

processed_data = re.sub(r'(?:\d)-', " -", raw_data)

xf = np.loadtxt(processed_data, dtype=float)

Cela remplace chaque - précédé d'un nombre avec -.

2
tituszban 28 juin 2019 à 09:00

Essayez le code ci-dessous:

with open('app.txt') as f:
    data = f.read()

import re 
data_mod = []
for number in data.split('\n')[:-1]:
    num = re.findall(r'[\w\.-]+-[\w\.-]',number)
    for n in num:
        number = number.replace('-',' -')
    data_mod.append(number)

with open('mod_text.txt','w') as f:
    for data in data_mod:
        f.write(data+"\n")

filename1='mod_text.txt'
xf = np.loadtxt(filename1, dtype=float)

En fait, vous devez traiter les données à l'aide d'expressions régulières. Après cela, vous pouvez charger ces données selon vos besoins.

J'espère que ça aide.

0
Shishir Naresh 28 juin 2019 à 08:53