Насколько я знаю, я сделал отступ правильно, я также пробовал тот же код в другом текстовом редакторе, но он выдает ту же ошибку.
Он выдает «IndentationError:», когда я использую try, кроме «with open ('file_name', 'mode') as file_handler:»
python3 test2.py Файл "test2.py", строка 9 кроме IOError: ^ IndentationError: ожидается блок с отступом
Я читал подобные статьи, и это говорит об отступе сознательно. Я также пробовал с табуляцией и 4 пробелами, но это не работает. Может быть, это глупая ошибка, которую я не понимаю. Пожалуйста, помогите мне, и я был бы признателен за предложения по улучшению этого кода, чтобы я мог чему-то научиться.
f_name = input("enter a file name:: ")
if f_name == 'na na boo boo':
print(f"\n{f_name} TO YOU - You have been punk'd!\n")
exit()
try:
with open(f_name, 'r') as f_hand:
except IOError:
print(f'File missing:: {f_name}.')
exit()
floating_points = []
for line in f_hand:
if line.startswith('X-DSPAM') :
start_index_pos = line.find(':')
start_index_pos = float(start_index_pos)
floating_points.append(start_index_pos)
print("The floating points are::\n")
for floating_point in floating_points:
print(floating_point)
print(f"There are {len(floating_points)} items on the list and they sum to {sum(floating_points)}.")
Вы не можете прерывать оператор with
предложением except
оператора try
. Он должен быть завершен в первую очередь. Часть кода может быть перемещена из оператора with
и размещена до или после (в зависимости от ситуации) оператора try
.
floating_points = []
try:
with open(f_name, 'r') as f_hand:
for line in f_hand:
if line.startswith('X-DSPAM') :
start_index_pos = line.find(':')
start_index_pos = float(start_index_pos)
floating_points.append(start_index_pos)
except FileNotFoundError:
print(f'File missing:: {f_name}.')
exit()
print("The floating points are::\n")
for floating_point in floating_points:
print(floating_point)
print(f"There are {len(floating_points)} items on the list and they sum to {sum(floating_points)}.")
Спасибо, я понимаю. Продолжает ли файл работать до тех пор, пока отступ оператора with не будет удален, или он останавливается после блока if. если файл продолжает работать до тех пор, пока не запустится блок with, то имеет смысл удалить отступ после блока for.
Это похоже на любое другое составное утверждение. Первая строка заканчивается двоеточием, и все строки с отступом не меньше, чем следующая строка, принадлежат составному оператору. Вы получили ошибку здесь, потому что тело было пустым.
Ваш код совершенно неверен, вы не используете диспетчер контекста только для открытия файла, для этого у нас есть open(), мы используем with
в качестве диспетчера контекста, чтобы он автоматически позаботился о закрытии файла позже.
и синтаксис неверен, вы не можете просто оставить оператор with
висящим с :
, операции с файлом должны быть внутри с отступом.
в любом случае вот правильный код
f_name = input("enter a file name:: ")
if f_name == 'na na boo boo':
print(f"\n{f_name} TO YOU - You have been punk'd!\n")
exit()
try:
with open(f_name, 'r') as f_hand:
floating_points = []
for line in f_hand:
if line.startswith('X-DSPAM'):
start_index_pos = line.find(':')
start_index_pos = float(start_index_pos)
floating_points.append(start_index_pos)
print("The floating points are::\n")
for floating_point in floating_points:
print(floating_point)
print(f"There are {len(floating_points)} items on the list and they sum to {sum(floating_points)}.")
except IOError:
print(f'File missing:: {f_name}.')
exit()
Да, я понял, но я думаю, что более эффективно перемещать память, кроме блока после блока for и float_points вверх, потому что после блока for мы фактически работаем в коде, а не в файле. как это сделал @chepner. Спасибо.
Память тут ни при чем. Новая область не создается; оператор with
просто разграничивает вызовы методов __enter__
и __exit__
контекстного менеджера, вот и все.
Вы не можете прервать оператор
with
предложениемexcept
оператораtry
.