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]))
(добавить контроль ошибок, как вам нравится)
Я думаю, что питонский путь - что-то вроде этого:
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