Это не файл csv.
При изменении CatPart
или CodeItem
они помечаются полем в начале строки, за которым следует номер переменнойпробелов, а затем значение
weight
& nb
всегда отображается на одной строке, разделенной пробелом.
Запись можетсчитается заполненным, когда существует следующая информация CatPart
, CodeItem
, weight
, nb
.
Один из способов реструктуризации документа состоит в том, чтобы перебирать строки и получать записи, когда они заполнены.
import io
import re
import pandas as pd
text = """CatPart 1
CodeItem 1
12 15
5.5 3
CodeItem 2
7 6
2 7
CatPart 5
CodeItem 0
1 25
1.5 7
CodeItem 8
25 1
22 1"""
records = []
part, item, weight, nb = '', '', '', ''
for line in io.StringIO(text):
if line.startswith('CatPart'):
_, part = re.split('\s+', line.strip())
if line.startswith('CodeItem'):
_, item = re.split('\s+', line.strip())
if re.match('^\d+', line):
weight, nb = re.split('\s+', line.strip())
records.append([part, item, weight, nb])
Обратите внимание, что я использовал io.StringIO
создать файл в памяти для этого примера.Замените это на что-то вроде этого:
with open('/path/to/my/file.txt') as in_file:
for line in in_file:
...
Затем передайте записи в конструктор pandas.DataFrame.
df = pd.DataFrame(records, columns=['CatPart', 'CatItem', 'weight', 'nb'])
создаст следующий вывод:
CatPart CatItem weight nb
0 1 1 12 15
1 1 1 5.5 3
2 1 2 7 6
3 1 2 2 7
4 5 0 1 25
5 5 0 1.5 7
6 5 8 25 1
7 5 8 22 1
ОднакоДо этого момента я не преобразовывал данные из строки.Вы можете выполнять преобразования при чтении данных или после структурирования данных в таблице с помощью:
df = df.astype(float)