Объект рассола имеет длину, отличную от 0, но элементы нельзя распечатать - PullRequest
0 голосов
/ 05 августа 2020

Моя цель - сохранить отфильтрованный список кортежей в файл pickle и иметь возможность снова открыть его и обработать его элементы.

Данные, с которыми я работаю, представляют собой список кортежей. Точнее:

lines = [((list of strings, tuple, tuple), 'string1', 'string2'), \
        (((list of strings, tuple, tuple), 'string2', 'string3'), \
        (((list of strings, tuple, tuple), 'string1', 'string2'), \
        (((list of strings, tuple, tuple), 'string3', 'string4')]

Важной частью здесь являются последние два элемента каждого кортежа.

Я хочу отфильтровать список таким образом, чтобы повторялись только кортежи с последними двумя строками. остается больше единицы.

[(some_tuple, 'string1' , 'string2' ), (some_tuple, 'string1' , 'строка2' ), (some_tuple, 'строка2' , 'строка3' )] -> [(some_tuple, 'строка1' , 'строка2' ), (some_tuple, 'строка1' , 'строка2' )]

(Пара строка1, строка2 появилась в двух кортежах , и пара строка2, строка3 только в одном)

import pickle 
import pandas as pd

lines = [((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e1', 'e2'), \
        ((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e0', 'e2'), \
        ((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e1', 'e2'), \
        ((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e2', 'e3')]

df = pd.DataFrame(lines, columns=['r', 'e1', 'e2'])
df = df.groupby(['e1', 'e2']).filter(lambda x: len(x) > 1)

D_f = list(df.to_records(index = False))
print(type(D_f))
print(D_f)

with open('data/output.pkl', 'wb') as output:
    pickle.dump(D_f, output)

Теперь возникает проблема. Когда я снова пытаюсь загрузить этот файл - ошибок нет, длина загруженного файла равна 2, а тип - список. Однако я не могу распечатать этот список или go через его 2 элемента с al oop. Все ломается на первом элементе без каких-либо ошибок.

with open('data/output.pkl', 'rb') as f: 
    D = pickle.load(f)

print(len(D))
print(type(D))

for i,x in enumerate(D):
    print(i)
    print(x)

Результат, который я ожидаю получить после чтения файла .pkl, представляет собой список кортежей, как это было раньше, а именно: [((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e1', 'e2'), ((['e0', 'e1', 'e2'], (0,1), (1,2)), 'e1', 'e2')]

PS Я также пытался просто сохраните и прочтите файл без фильтрации, это, кажется, работает нормально (я ожидаю, что проблема в том, что я нарушаю sth в формате, когда помещаю его в pandas фрейм данных, а затем пытаюсь воссоздать его).

И я также попытался прочитать файл сразу после того, как он был сохранен в том же скрипте - это тоже работает, что я нахожу крайне странным.

Заранее большое спасибо за все предложения!

...