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")