2017-07-24 4 views
0

J'essaie de lire des données ascii de lignes non-uniformes, par ex.Lecture de données ascii de lignes non uniformes - Python

4 0.0790926412 -0.199457773 0.325952223 0.924105917 48915.3072 -2086.17061 
    73540.4807 10 
4 0.0245689377 -0.805261448 -0.152373497 0.573006386 -39801.696 49084.2418 
    16665.3857 10 
4 0.0427767979 -0.0185129676 -0.143135691 -0.989529911 38770.6518 
-70784.7024 32640.6307 10 
4 0.0262684678 0.137741 -0.820259709 -0.555158921 25293.3918 -51148.4003 
-126522.859 10 
4 0.145932295 0.466618154 -0.00805648931 -0.88442218 90951.8483 19221.4234 
-40205.3438 10 
4 0.0907820906 0.584060054 -0.671576188 0.455915866 -78193.2124 -31269.5848 
    47260.338 10 
4 0.0794897928 0.654042761 0.537625452 0.532153117 24643.9195 39614.3788 
    97184.4856 10 
4 0.0896920622 -0.517384933 -0.609729743 -0.600451889 -17455.9074 -17601.0439 
-13991.5163 10 
4 0.0295554749 -0.53757783 -0.3710939 0.757165368 20106.124 -171013.738 
-14052.1145 10 
4 0.0189505245 -0.773354757 -0.0747623556 -0.629549847 -71468.2726 
-53145.1259 36948.4058 10 

Le problème est que je dois lire chaque deux lignes en un seul. J'essaie d'utiliser pandas.read_csv ou numpy.genfromtxt, mais ils lisent et séparent en lignes indépendantes. J'ai essayé de fusionner toutes les 2 lignes sans succès, parce que, comme vous pouvez le voir, parfois j'ai une ligne séparée en 7 et 2 colonnes, somentimes en 6 et 3 colonnes. Avec 9 colonnes au total à lire.

Répondre

1

Quelque chose comme ça devrait fonctionner. Mettez vos données dans une chaîne, ou dans un document et manipulez-les avec python.

Ensuite, lorsque vous avez vos données comme vous le souhaitez, vous utilisez des pandas.

string1 = '''4 0.0790926412 -0.199457773 0.325952223 0.924105917 48915.3072 -2086.17061 
    73540.4807 10 
4 0.0245689377 -0.805261448 -0.152373497 0.573006386 -39801.696 49084.2418 
    16665.3857 10 
4 0.0427767979 -0.0185129676 -0.143135691 -0.989529911 38770.6518 
-70784.7024 32640.6307 10 
4 0.0262684678 0.137741 -0.820259709 -0.555158921 25293.3918 -51148.4003 
-126522.859 10 
4 0.145932295 0.466618154 -0.00805648931 -0.88442218 90951.8483 19221.4234 
-40205.3438 10 
4 0.0907820906 0.584060054 -0.671576188 0.455915866 -78193.2124 -31269.5848 
    47260.338 10 
4 0.0794897928 0.654042761 0.537625452 0.532153117 24643.9195 39614.3788 
    97184.4856 10 
4 0.0896920622 -0.517384933 -0.609729743 -0.600451889 -17455.9074 -17601.0439 
-13991.5163 10 
4 0.0295554749 -0.53757783 -0.3710939 0.757165368 20106.124 -171013.738 
-14052.1145 10 
4 0.0189505245 -0.773354757 -0.0747623556 -0.629549847 -71468.2726 
-53145.1259 36948.4058 10''' 

splitted = string1.splitlines() 
result = "" 
for index,item in enumerate(splitted): 
    if index % 2 != 0: 
    result += item+ "\n" 
    else: 
     result += item 
print(result) 

4 0.0790926412 -0.199457773 0.325952223 0.924105917 48915.3072 -2086.17061 73540.4807 10 
4 0.0245689377 -0.805261448 -0.152373497 0.573006386 -39801.696 49084.2418 16665.3857 10 
4 0.0427767979 -0.0185129676 -0.143135691 -0.989529911 38770.6518 -70784.7024 32640.6307 10 
4 0.0262684678 0.137741 -0.820259709 -0.555158921 25293.3918 -51148.4003 -126522.859 10 
4 0.145932295 0.466618154 -0.00805648931 -0.88442218 90951.8483 19221.4234 -40205.3438 10 
4 0.0907820906 0.584060054 -0.671576188 0.455915866 -78193.2124 -31269.5848 47260.338 10 
4 0.0794897928 0.654042761 0.537625452 0.532153117 24643.9195 39614.3788 97184.4856 10 
4 0.0896920622 -0.517384933 -0.609729743 -0.600451889 -17455.9074 -17601.0439 -13991.5163 10 
4 0.0295554749 -0.53757783 -0.3710939 0.757165368 20106.124 -171013.738 -14052.1145 10 

Ou si vous le lisez à partir d'un fichier:

data = open('/path/original.txt', 'r') 
string1 = data.read() 
splitted = string1.splitlines() 
result = "" 
for index,item in enumerate(splitted): 
    if index % 2 != 0: 
    result += item+ "\n" 
    else: 
    result += item 
new_data = open('/path/new_data.txt','w') 
new_data.write(result) 
+1

Merci, j'ai seulement ajouté ce qui suit dans votre code. Pour lire comme une chaîne, j'ai utilisé data = open ('/ path/original.txt,' r '), puis string1 = data.read(). Après avoir exécuté tout votre code, j'avais besoin de sauvegarder la chaîne reformée, j'ai donc écrit un nouveau fichier comme new_data = open ('/ path/new_data.txt', 'w') puis new_data.write (résultat). Après cela, je l'ai lu en utilisant des pandas! Peut-être pourriez-vous ajouter cela dans votre réponse pour être plus détaillé. Merci encore. – nandhos

+1

L'a fait! Je viens d'ajouter un guillemet manqué dans votre dernière édition – nandhos

1

Si moi, je voudrais faire à cette façon:

import re 
with open('data.txt') as f: 
    s = f.read().strip() 
L = [float(i) for i in re.split(r'\s+', s)] 
LL = [L[i:i+9] for i in range(0, len(L), 9)] 
print(LL) 

[[4.0, 0,0790926412, - 0,199457773, 0,325952223, 0,924105917, 48915,3072, -2086,1761, 73540,4807, 10,0], [4,0, 0,0245689377, -0,805261448, -0,152373497, 0,573006386, -39801,696, 49084,2418, 16665,3857, 10,0], [4,0, 0,0427767979, -0,0185129676, -0,143,136,991, -0.989529911, 38770.6518, - 70784.7024, 32640.6307, 10.0], [4.0, 0.0262684678, 0.137741, -0.820259709, -0.555158921, 25293.3918, -51148.4003, -126522.859, 10.0], [4.0, 0.145932295, 0.466618154, -0.00805648931, -0.88442218, 90951.8483, 19221.4234, -40205.3438 , 10,0], [4,0, 0,0907820906, 0,584060054, -0,671576188, 0,455915866, -78193,2124, -31269,5848, 47260,338, 10,0], [4,0, 0,0794897928, 0,654042761, 0,537625452, 0,532153117, 24643,9195, 39614,3788, 97184,4856, 10,0], [4,0, 0,0896920622, -0,517384933, -0,609729743, -0,600451889, -17455,9074, -17601,0439, -13991,5163, 10,0], [4,0, 0,0295554749, -0,53757783, -0,3710939, 0,757165368, 20106,124, -171013,738, -14052,1145, 10,0], [4,0, 0,0189505245, -0,773354757, -0,0747623556, -0,629549847, -71468,2726, -53145,1259, 36948,4058, 10,0]]

1

Ou comme ceci, puisque vous savez qu'il y a deux lignes par cas.

Lire deux lignes d'entrée à chaque fois dans la boucle. Lorsque la première ligne est vide, cela signifie qu'il n'y a plus de lignes disponibles dans le fichier d'entrée. Chaque fois qu'une paire de lignes est lue, concattez-les après avoir écarté la ligne se terminant par la première ligne.

Les pandas peuvent lire un fichier 'csv' qui utilise un espace blanc à la place des virgules.

>>> import pandas as pd 
>>> with open('temp.txt') as input, open('temp.csv', 'w') as the_csv: 
...  while True: 
...   first = input.readline() 
...   if not first: 
...    break 
...   second = input.readline() 
...   r = the_csv.write(first.strip()+second) 
... 
>>> df = pd.read_csv('temp.csv', sep='\s+') 
>>> df 
    4 0.0790926412 -0.199457773 0.325952223 0.924105917 48915.3072 \ 
0 4  0.024569  -0.805261 -0.152373  0.573006 -39801.6960 
1 4  0.042777  -0.018513 -0.143136 -0.989530 38770.6518 
2 4  0.026268  0.137741 -0.820260 -0.555159 25293.3918 
3 4  0.145932  0.466618 -0.008056 -0.884422 90951.8483 
4 4  0.090782  0.584060 -0.671576  0.455916 -78193.2124 
5 4  0.079490  0.654043  0.537625  0.532153 24643.9195 
6 4  0.089692  -0.517385 -0.609730 -0.600452 -17455.9074 
7 4  0.029555  -0.537578 -0.371094  0.757165 20106.1240 
8 4  0.018951  -0.773355 -0.074762 -0.629550 -71468.2726 

    -2086.17061 73540.4807 10 
0 49084.2418 16665.3857 10 
1 -70784.7024 32640.6307 10 
2 -51148.4003 -126522.8590 10 
3 19221.4234 -40205.3438 10 
4 -31269.5848 47260.3380 10 
5 39614.3788 97184.4856 10 
6 -17601.0439 -13991.5163 10 
7 -171013.7380 -14052.1145 10 
8 -53145.1259 36948.4058 10