функция рендеринга элементов буквы буквами не в виде строки - PullRequest
0 голосов
/ 18 апреля 2019

цель сценария:

анализ файлов журнала => скажем, операция на хосте прошла успешно или не удалась в зависимости от текста в файле журнала => извлечь имена хостов и записать их в файл 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")

Что я хочу получитьэто:

УСПЕХ: HOSTNAME-01

УСПЕХ: HOSTNAME-02

СБОЙ: HOSTNAME-03

что я получаю:

F

A

I

L

U

R

E

:

H

O

S

T

N

A

M

E

-

0

3

1 Ответ

1 голос
/ 18 апреля 2019

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...