#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.