Как прочитать файл с несколькими строками? - PullRequest
0 голосов
/ 14 февраля 2019

Строки в моем файле распределены по нескольким строкам.В следующем фрагменте моего файла первая строка начинается с 0,0000000000000000E + 00, а вторая строка начинается с 1,5625000000000000E-02.Как мне прочитать числа от 0,0000000000000000E + 00 до одного до 1.5625000000000000E-02 как одну строку?

Я пытаюсь использовать функцию numpy genfromtxt () и pandas read_csv (), но я пока не смог связатьсясистема, что я хочу сделать.

#I have put quotation marks here just to indicate the start and end of rows. They
#are not part of the file.

"0.0000000000000000E+00 

00000000     4.9999998882412910E-03       8.7714487508765548E-03  

00000001     5.0000002374872565E-04       5.0877144875087654E-01"


"1.5625000000000000E-02 

00000000     4.9999998882412910E-03       8.4622513106357884E-03 

00000001     5.0000002374872565E-04       5.0864039953085094E-01"

После правильного чтения мой входной массив будет выглядеть так:

0.0000000000000000E+00   00000000    4.9999998882412910E-03       8.7714487508765548E-03      00000001   5.0000002374872565E-04       5.0877144875087654E-01

1.5625000000000000E-02   00000000    4.9999998882412910E-03       8.4622513106357884E-03      00000001   5.0000002374872565E-04       5.0864039953085094E-01

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Вывод в виде двух списков:

import re

file_object = open("over.txt",'rU')

df1=[]
df2=[]
content = ''

try:
    for line in file_object:
        content = content + line
finally:
     file_object.close()

words = re.split(pattern="\n\n\n", string=content)

num = re.sub(pattern="\s+", repl=",", string=words[0])
for i in num.split(","):
    df1.append(float(i))

num = re.sub(pattern="\s+", repl=",", string=words[1])
for i in num.split(","):
    df2.append(float(i))

print df1
print df2

Вывод:

[0.0, 0.0, 0.004999999888241291, 0.008771448750876555, 1.0, 0.0005000000237487257, 0.5087714487508765]
[0.015625, 0.0, 0.004999999888241291, 0.008462251310635788, 1.0, 0.0005000000237487257, 0.5086403995308509]
0 голосов
/ 14 февраля 2019

Предполагая, что вы хотите иметь 7 строк в выходных данных, и это ваш файл .Итак, вот как это разобрать в pandas фрейм данных:

import pandas as pd

with open('temp.txt') as f:
    d = f.read().split()

data = {'col1': [], 'col2': [], 'col3': [], 'col4': [], 'col5': [], 'col6': [], 'col7': []}
for i in range(0, len(d), 7):
    for j in range(7):
        data['col{}'.format(j+1)].append(d[j])

df = pd.DataFrame(data)

Вывод:

enter image description here

0 голосов
/ 14 февраля 2019

Код ниже должен правильно проанализировать содержимое вашего файла:

import re
import pandas

sample = """0.0000000000000000E+00 

00000000     4.9999998882412910E-03       8.7714487508765548E-03  

00000001     5.0000002374872565E-04       5.0877144875087654E-01


1.5625000000000000E-02 

00000000     4.9999998882412910E-03       8.4622513106357884E-03 

00000001     5.0000002374872565E-04       5.0864039953085094E-01
"""


def load_matrix(content):
    lines = (line for line in content.splitlines() if len(line.strip()) > 0)

    rows = list()
    row = list()
    for line in lines:
        fields = line.split()
        is_continuation = re.match(r'^\d{8}$', fields[0])
        if is_continuation:
            row += [float(value) for value in fields[1:]]

        else:
            if (len(row) > 0):
                rows.append(row)

            row = [float(value) for value in fields]

    rows.append(row)
    return pandas.DataFrame(rows)

print(load_matrix(sample))

Отображается:

          0      1         2       3         4
0  0.000000  0.005  0.008771  0.0005  0.508771
1  0.015625  0.005  0.008462  0.0005  0.508640
0 голосов
/ 14 февраля 2019

Это должно работать с пакетом регулярных выражений.

text = """

0.0000000000000000E+00 

00000000     4.9999998882412910E-03       8.7714487508765548E-03  

00000001     5.0000002374872565E-04       5.0877144875087654E-01


1.5625000000000000E-02 

00000000     4.9999998882412910E-03       8.4622513106357884E-03 

00000001     5.0000002374872565E-04       5.0864039953085094E-01"""

Код:

import re
xx = re.split(pattern="\n\n\n", string=text)

for xy in xx:
    xy = re.sub(pattern="\s+", repl=" ", string=xy)
    print(xy)
    print("*"*55)

Вывод:

0.0000000000000000E+00 00000000 4.9999998882412910E-03 8.7714487508765548E-03 00000001 5.0000002374872565E-04 5.0877144875087654E-01
*******************************************************
1.5625000000000000E-02 00000000 4.9999998882412910E-03 8.4622513106357884E-03 00000001 5.0000002374872565E-04 5.0864039953085094E-01
*******************************************************
...