Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2010 19:58:13

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

обработка нескольких файлов и запись

Стоит задача обработать несколько bmp файлов и данные с них сохранить в txt.

Как понимаю выглядеть это должно примерно так:

import PIL
from PIL import Image
from Queue import Queue
from threading import Thread
queue = Queue()
#Sozdaem ochered kartinok & imen failov
name = ["1.bmp", "2.bmp", "3.bmp", "4.bmp", "5.bmp", "6.bmp", "7.bmp", "8.bmp", "9.bmp", "0.bmp"]
mozg = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
def perc(i, q):
while True:
bmp = q.get()
print "Testing"% (i, bmp)
image = Image.open(bmp)
image.getcolors()

for i in range(num_threads):
worker = Thread(target=perc, args=(i, queue))
worker.setDaemon(True)
worker.start()
for bmp in name:
queue.put(bmp)
queue.join()
Но это я делаю только для одной очереди - чтения. Как сделать вторую очередь записи? И как это будет выглядеть вместе?



Отредактировано (Май 22, 2010 20:50:04)

Офлайн

#2 Май 22, 2010 20:41:53

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

обработка нескольких файлов и запись

Трудно сказать. Непонятно вообще что вы делаете. Зачем name и mozg, которые нигде не используются? Где функция pinger? Где зовется perc? В общем нужно более внятное объяснение.



Офлайн

#3 Май 22, 2010 20:47:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

обработка нескольких файлов и запись

А зачем мультипоточность? Чтобы все помедленнее работало и более феерично глючило? 8-)
Если используете queue.join() - потрудитесь делать еще и queue.task_done()
Потоки-демоны - зло. Вполне можно обойтись нормальными, с .join в конце работы.



Офлайн

#4 Май 22, 2010 20:52:27

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

обработка нескольких файлов и запись

Ed, извините, это я нашел исходный код реализующий поточность и некорректно вклеил в свою задачу.Поправил.
Андрей Светлов, а можете на примере показать?



Отредактировано (Май 22, 2010 20:53:00)

Офлайн

#5 Май 22, 2010 21:07:58

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

обработка нескольких файлов и запись

Теперь немного получше. Ну и что нужно сделать? Зачем еще одна очередь? Пишите прям в выходные файлы в том же потоке, где читаете.
Кстати, я бы посоветовал использовать multiprocessing.Pool http://docs.python.org/library/multiprocessing.html?highlight=pool#module-multiprocessing.pool вместо Treading. Если у вас больше одного core, то будет быстрее. Да и кода поменьше.



Офлайн

#6 Май 22, 2010 21:21:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

обработка нескольких файлов и запись

Показать - что?
multiprocessing.Pool +1



Офлайн

#7 Май 22, 2010 21:54:00

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

обработка нескольких файлов и запись

Андрей Светлов & Ed, прошу прощения, я начинающий питонер, не совсем понимаю как писать в тот же поток. Можно пример кода?



Офлайн

#8 Май 22, 2010 23:58:35

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

обработка нескольких файлов и запись

Что, тоже студент, что ли?
Какие данные нужно сохранить-то? В текущем коде только getcolors зовется.



Офлайн

#9 Май 23, 2010 02:52:22

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

обработка нескольких файлов и запись

Ed, вот их и нужно сохранить по файлам с именами от 0 до 9



Офлайн

#10 Май 23, 2010 14:05:06

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

обработка нескольких файлов и запись

Ну так вот, можно в очередь затолкать просто цифры range(10). В функции со странным названием perc нужно взять цифру из очереди, сделать из нее имя файла путем добавления .bmp, достать из файла цвета с помощью PIL, записать их в файл с именем, совпадающим с цифрой, которую взяли из очереди. Вот и все. Если попользоваться multiprocessing.Pool, то кода будет совсем чуть-чуть.
Пробуйте, показывайте здесь результат, обсудим.



Отредактировано (Май 23, 2010 14:05:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version