Ниже мой кусок кода.

import numpy as np

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

Ниже мой файл данных.

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

Как можно видеть, есть отрицательные значения, которые занимают пространство между 2 значениями, что приводит к тому, что numpy дает

ValueError: Wrong number of columns at line 3

Это всего лишь небольшой фрагмент моего кода. Я хочу прочитать эти данные, используя numpy или панд. Любое предложение было бы здорово.

Изменить 1:

@ZarakiKenpachi Я использовал ваше предложение sep = '| -', но это дает мне дополнительный 4-й столбец со значениями NaN.

Изменить 2:

@Serge Ballesta хорошее предложение, но все это какая-то предварительная обработка. Я хочу, чтобы какая-то встроенная функция делала это в пандах или numpy.

Изменить 3:

Важное примечание . Следует отметить, что в 0.4373E-03 также имеется отрицательный знак.

Спасибо

1
WhySoSerious 28 Июн 2019 в 11:28

3 ответа

Лучший ответ

np.loadtext может читать из (байтовой строки) генератора, поэтому вы можете фильтровать входной файл при загрузке, чтобы добавить дополнительный перед минусом:

...
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)

Для этого не требуется предварительно загружать все в память, поэтому ожидается, что она будет эффективно использовать память.


Регулярное выражение требуется, чтобы избежать изменения чего-то вроде 0.16545E-012.

В моих тестах на 10 000 строк, это должно быть не более чем на 10% медленнее, чем загрузка всего в память, но потребует гораздо меньше памяти

2
Serge Ballesta 28 Июн 2019 в 10:10

Вы можете сделать предварительную обработку ваших данных, чтобы добавить дополнительный пробел перед вашими - знаками. Хотя есть много способов сделать это, наилучшим подходом, по моему мнению (чтобы избежать добавления пробелов в начале строки), является использование 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)

Это заменяет каждый -, которому предшествует число, -.

2
tituszban 28 Июн 2019 в 09:00

Попробуйте следующий код:

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)

На самом деле вы должны обработать данные, используя регулярные выражения. После этого вы можете загрузить эти данные, как вам нужно.

Надеюсь, это поможет.

0
Shishir Naresh 28 Июн 2019 в 08:53