2013-12-03 2 views
3

Я последовательно записываю пакеты данных из нескольких потоков. В зависимости от данных в каждом пакете мне нужно записать данные в конкретный файл журнала. У меня будет до 8 файлов, открытых одновременно, для обеспечения максимум 8 параллельных потоков данных. Файлы журнала открываются и закрываются в начале и в конце нового потока данных.Python: как динамически писать для нескольких файлов

У меня есть следующий код для обработки операций записи.

#Identify where the data needs to be stored 
filePointer = unpack_from('!B',payload, 4) 

#Grab the data   
capData = unpack_from('!160s', payload, 10)   

#Store the data 
if filePointer[0] == 1: Logfile1.write(str(capData[0])) 
elif filePointer[0] == 2: Logfile2.write(str(capData[0])) 
elif filePointer[0] == 3: Logfile3.write(str(capData[0])) 
elif filePointer[0] == 4: Logfile4.write(str(capData[0])) 
elif filePointer[0] == 5: Logfile5.write(str(capData[0])) 
elif filePointer[0] == 6: Logfile6.write(str(capData[0])) 
elif filePointer[0] == 7: Logfile7.write(str(capData[0])) 
elif filePointer[0] == 8: Logfile8.write(str(capData[0])) 

Есть ли более хороший способ pythony для этого?

Может ли переменная каким-то образом использоваться для создания дескриптора файла или возврата требуемого дескриптора файла?

Приветствие

Pob

ответ

3

Вы можете создать словарь файловыми указателями и использовать его для динамического выбора файла:

d = {1: Logfile1, 2: Logfile2, ...} 
curr_file = d[filePointer[0]] 
curr_file.write(str(capData[0])) 
+0

Спасибо, Дэниэл, я отдам это. Можно ли использовать эту технику для открытия файлов? – Pobbel

+0

Конечно, вы можете попробовать что-то вроде d = {i + 1: open (f) для i, f в zip (диапазон (len (file_list)), file_list)}. Это дает вам обработчики файлов напрямую. – Daniel

2

Вы можете просто использовать список, скажем, "лога", для хранения файловых объектов "logfileN".

Или ДИКТ, пример кода:

logfiles = {} 
for i in range(1, 9): 
    logfiles[i] = open("Mylog_%s.log"%(i,), "w") 


for filePointer, capData in yourLoop: 
    logfiles[filePointer[0]].write(str(capData[0])) 

(добавить контроль ошибок, как вам нравится)

+0

Спасибо, я думаю, это отвечает на мой вопрос для Даниэля о том, как обращаться с файлом также открывается. Приветствия – Pobbel

1

использование Dict, карта filePointer [0] для LOGFILE

1

Я думаю, что питонический способ - hing вот так:

logFileHandlers = { 
    1: Logfile1, 
    2: Logfile2, 
    3: Logfile3, 
    4: Logfile4, 
    5: Logfile5, 
    6: Logfile6, 
    7: Logfile7, 
    8: Logfile8, 
} 
try: 
    fileHandler = logFileHandlers[filePointer[0]] 
    fileHandler.write(str(capData[0])) 
except KeyError as e: 
    print e # handle exception: unrecognized data from stream 
Смежные вопросы