Python: как динамически записывать в несколько файлов

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

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

#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]))

Есть ли более приятный способ сделать это?

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

ура

Pob

4 ответа

Решение

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

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

Вы можете просто использовать список, скажем, "logfiles", для хранения ваших файловых объектов "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]))

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

Используйте dict, map filePointer[0] для файла журнала

Я думаю, что питонский путь - что-то вроде этого:

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
Другие вопросы по тегам