цель скрипта:
разобрать файлы журнала => сказать, что операция на хосте была успешной или неудачной, в зависимости от некоторого текста в файле журнала => извлечь имена хостов и записать их в файл CSV
Проблема:
Когда я пытаюсь записать данные в файл csv, он выводит мне только последний член списка и показывает его построчно
def parselogfiles(directory):
for f in os.listdir(directory):
if f.endswith(".log"):
filepath = os.path.join(directory,f)
if os.stat(filepath).st_mtime > now - 1 * 86400:
with open (filepath, mode = "rt", encoding = "utf-8") as logfile:
f2 = logfile.read()
if success in f2:
hostname = re.findall(r'\w{1,5}\-\d{1,2}', f2)
accesses = successm+hostname[0]
elif failure in f2:
hostname = re.findall(r'\w{1,5}\-\d{1,2}', f2)
accesses = failmessage+hostname[0]
print(accesses)
return (accesses)
with open(filename, mode='a', newline='') as lg:
writer = csv.writer(lg, dialect='excel')
for l in parselogfiles(logdir):
print (l)
writer.writerow([l])
print("write succeeded")
Что я хочу получить:
УСПЕХ: ИМЯ ХОСТА-01
УСПЕХ: ИМЯ ХОСТА-02
ОШИБКА: ИМЯ ХОСТА-03
что я получаю:
Ф
А
я
л
U
р
Е
:
ЧАС
О
С
Т
Н
А
М
Е
-
0
3






accesses это строка. Вы сбрасываете accesses внутри каждой итерации цикла for, выполняя accesses = ..., поэтому, в конце концов, return accesses вернет строку результата только для последнего обработанного файла. Сейчас,
for l in parselogfiles(logdir):
print (l)
writer.writerow([l])
будет перебирать все отдельные символы этой строки, что приведет к результату, который вы получаете.
Один из способов добиться того, чего вы хотите, - это использовать вместо этого список и поместить строки результатов всех файлов в этот список. Это всего лишь небольшие изменения в вашем коде:
def parselogfiles(directory):
accesses = [] # is now an empty list
for f in os.listdir(directory):
if f.endswith(".log"):
filepath = os.path.join(directory,f)
if os.stat(filepath).st_mtime > now - 1 * 86400:
with open (filepath, mode = "rt", encoding = "utf-8") as logfile:
f2 = logfile.read()
if success in f2:
hostname = re.findall(r'\w{1,5}\-\d{1,2}', f2)
accesses.append(successm+hostname[0]) # saves the result to the list
elif failure in f2:
hostname = re.findall(r'\w{1,5}\-\d{1,2}', f2)
accesses.append(failmessage+hostname[0])
print(accesses) # will print the list once after every file
return (accesses) # returns the list after all files have been processed
with open(filename, mode='a', newline='') as lg:
writer = csv.writer(lg, dialect='excel')
for l in parselogfiles(logdir): # now will print elements of the list instead of characters in the string
print (l + '\n')
writer.writerow([l])
print("write succeeded")
большое спасибо за объяснение и решение