Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2016 12:52:58

oreol
Зарегистрирован: 2016-07-03
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка переменных из файла через цикл

Пытаюсь подгрузить несколько массивов, предварительно законсервировав их в отдельные файлы с помощью pickle. Когда прописывал файлы/переменные вручную было все ОК, а как только попытался сделать тоже через цикл - фейл (+вогнал себя в ступор).
Ниже код:

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pickle
#Мои массивы 
Pole1 = [['Sony', 40], ['Philips', 36]]
Pole2 = [['New York', 40], ['Rome', 36]]
#Сохраняю массивы Pole1 и Pole2 в отдельные файлы
for i in ['Pole1'. 'Pole2']:
    testOpen = open( i +'.pkl', 'wb')    #Пытаюсь создать файлы Pole1.pkl & Pole2.pkl
    pickle.dump(i, testOpen)      #Подгружаю массив по образцу: значение переменной Pole1 в файл Pole1.pkl
#Пытаюсь извлечь данные из файлов Pole1.pkl и Pole2.pkl и присвоить им соответсвующие переменные
for i in ['Pole1', 'Pole2']:
    testOpen = open(i + '.pkl', 'rb')
    i = pickle.load(testOpen) #[size 32]!!![/size]

И на этом месте я в ступоре. Не пойму, как теперь присвоить имя новой переменной (i), а ее значение вытащить из файла (i + ‘.pkl’)?
Также вопрос есть ли более простое решение, и как хранить много переменных в одном файле?

Приходит в голову загрузка переменных из файлов с помощью if/elif
 for i in ['Pole1', 'Pole2']:
    testOpen = open(i + '.pkl', 'rb')
    i = pickle.load(testOpen)
    if i == 'Pole1':
        Pole1 = pickle.load(testOpen)
    elif i == 'Pole2':
        Pole2 = pickle.load(testOpen)
, но тогда код становится избыточным и проще будет обойтись без цикла for, а прописать отдельно:
 Pole1 = pickle.load(open(Pole1.pkl', 'rb'))
 Pole2 = pickle.load(open(Pole2.pkl', 'rb'))

Отредактировано oreol (Сен. 16, 2016 13:05:23)

Офлайн

#2 Сен. 18, 2016 06:59:11

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Загрузка переменных из файла через цикл

Чтобы динамически создать переменные в цикле можно использовать функцию locals():

 for i in ['Pole1', 'Pole2']:
    with open(i + '.pkl', 'rb') as testOpen:
        locals()[i] = pickle.load(testOpen)

В этом плохо только то, что названия переменных в самих файлах не сохраняются (они только в имени). Пожалуй, лучше использовать один файл *.pkl, а в него поместить словарь:

 mydata = {'Pole1' : [1,2,3], 'Pole2': [5,6,7]}
with open('mydata.pkl', 'w') as f:
    pickle.dump(mydata, f)
# to load data:
with open('mydata.pkl', 'r') as f:
    data = pickle.load(f)
# Finally, we create variables in the local scope 
for key in data:
    locals()[key] = data[key]

Отредактировано scidam (Сен. 18, 2016 07:00:03)

Офлайн

#3 Сен. 20, 2016 18:46:26

realivan
Зарегистрирован: 2015-08-15
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузка переменных из файла через цикл

Можно так

  #!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pickle
#Мои массивы 
Pole1 = [['Sony', 40], ['Philips', 36]]
Pole2 = [['New York', 40], ['Rome', 36]]
#Сохраняю массивы Pole1 и Pole2 в отдельные файлы
for i in ['Pole1', 'Pole2']:
    testOpen = open( i +'.pkl', 'wb')    #Пытаюсь создать файлы Pole1.pkl & Pole2.pkl
    pickle.dump(i, testOpen)      #Подгружаю массив по образцу: значение переменной Pole1 в файл Pole1.pkl
#Пытаюсь извлечь данные из файлов Pole1.pkl и Pole2.pkl и присвоить им соответсвующие переменные
# создаем словарь для хранения данных
l = {
    1: [],
    2: []
}    
for i in ['Pole1', 'Pole2']:
    j = ['Pole1', 'Pole2'].index(i) # определяем индекс
    testOpen = open(i + '.pkl', 'rb')
    l[j] = pickle.load(testOpen) # сохраняем в словарь по индексу
    print(l[j])
Но только ты не списки сохраняешь, а строки ‘Pole1’, ‘Pole2’.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version