Удаление пустых строк и комментариев в Python (без регулярных выражений)

#python #string #list

#python #строка #Список

Вопрос:

Я новичок (3-я неделя кодирования), и у меня следующая проблема:

Я хочу удалить все комментарии и пустые строки из списка, созданного w / .readlines() . Однако мой подход кажется неправильным, и я не знаю, как поступить.

Содержимое .txt файла:

 subject1: 3.5

# comment hello


subject2: 4.25
subject3:5.20


subject4:           4.75
  

И мой код:

 import os

def get_average_grade(path):
    if not os.path.exists(path):
        return None
    with open(path, "r") as file:
        gradelist = file.readlines()
        print(gradelist)
        amount = 0
        for item in gradelist:
            if item[0] == "#" or item[0] == "n":
                gradelist.remove(item)

    print(gradelist)
  

Вывод, который должен содержать только предметы и соответствующие оценки (оценка в Швейцарии содержит значения с плавающей запятой от 1 до 6):

Мой фактический результат

 ['subject1: 3.5n', 'n', '# comment hellon', 'n', 'n', 'subject2: 4.25n', 'subject3:5.20n', 'n', 'n', 'subject4:           4.75n', 'n']

['subject1: 3.5n', '# comment hellon', 'subject2: 4.25n', 'subject3:5.20n', 'n', 'subject4:           4.75n', 'n']
  

Мой ожидаемый результат

 ['subject1: 3.5n', 'n', '# comment hellon', 'n', 'n', 'subject2: 4.25n', 'subject3:5.20n', 'n', 'n', 'subject4:           4.75n', 'n']

['subject1: 3.5', 'subject2: 4.25', 'subject3:5.20', 'subject4:          4.75']
  

Как вы можете видеть, комментарии и некоторые пустые строки остаются в списке моих фактических выходных данных.

Любая помощь приветствуется! Спасибо.

Ответ №1:

 with open('file.txt', 'r') as f:
    lines = f.read()

subjects = [row for row in lines.split('n') if '#' not in row and row]
subjects = {row.split(':')[0].strip():row.split(':')[1].strip() for row in subjects}

  

Вывод :

 >> subjects
{'subject1': '3.5', 'subject2': '4.25', 'subject3': '5.20', 'subject4': '4.75'}
  

Код довольно прост. Вы удаляете все n , пустые строки и строки, содержащие # . Вы разделяете : и создаете словарь.

Комментарии:

1. Спасибо за вашу помощь. У меня действительно не было много знаний о словарях заранее, и это было действительно полезным и коротким решением моей проблемы.

2. Рад это слышать. Вы можете отметить наиболее подходящее решение из 5 ответов.

Ответ №2:

Хотя другие ответы пытаются решить эту проблему, используя понимание списка, я считаю, что, вероятно, немного понятнее сделать это без них.

Код похож на код ijn, за исключением того, что вместо удаления недопустимых элементов из gradelist он добавляет допустимые элементы в пустой список.

 def get_average_grade(path):
    if not os.path.exists(path):
        return None
    with open(path, "r") as file:
        text = file.read()
        splitted = text.split('n')
        gradelist = []

        for item in splitted:
            if item != "" and item[0] != "#":
                gradelist.append(item)

    print(gradelist)

  

Комментарии:

1. Спасибо, я также смог заставить его работать «по-своему»!

2. Не беспокойтесь, вы можете принять один из ответов, нажав на символ галочки рядом с ответом, который вы хотите принять!

Ответ №3:

Возможно, вы захотите удалить строки и пропустить те, которые начинаются с. #

Попробуйте это:

 with open("sample.txt") as f:
    sample = f.readlines()

print([l.strip() for l in sample if not l.startswith("#") and l.strip() != ""])
  

Затем, если вам захочется, вы можете создать словарь со всеми темами и метками:

 with open("sample.txt") as f:
    sample = f.readlines()

cleaned_up = [l.strip() for l in sample if not l.startswith("#") and l.strip() != ""]

data = {}
for item in cleaned_up:
    subject, mark = item.split(":")
    subject = subject.strip()
    data.setdefault(subject, []).append(mark.strip())

print(data)
  

Вывод:

 {'subject1': ['3.5'], 'subject2': ['4.25'], 'subject3': ['5.20'], 'subject4': ['4.75']}
  

Комментарии:

1. Большое вам спасибо. Я смог заставить его работать с вашей помощью!

Ответ №4:

Я думаю, это вам поможет. Он работает правильно, как вы хотите.

 import os

def get_average_grade(path):
    if not os.path.exists(path):
        return None
    with open(path, "r") as file:
        gradelist = []
        amount = 0
        for item in file:
            if item.startswith("#") or item.startswith("n"):
                continue
            else:
                item = item.strip()
                gradelist.append(item)

    print(gradelist)

  

** Вывод **

 ['subject1: 3.5', 'subject2: 4.25', 'subject3:5.20', 'subject4:           4.75']
  

Комментарии:

1. С помощью этой реализации я также смог заставить ее работать! Спасибо за доработку вашего первого ответа! .strip() было действительно полезно. Интересно, почему этому не учили в моем классе.

2. Добро пожаловать. Если это решит вашу проблему, пожалуйста, примите мой ответ, нажав кнопку tick.