Функция отображает элементы по буквам, а не как строку

цель скрипта:

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

большое спасибо за объяснение и решение

ricardo 18.04.2019 13:51

Другие вопросы по теме