Единственная проблема заключается в том, что он выдает «IndentationError:», когда я использую try, кроме как с «с открытым ('file_name', 'mode') as file_handler:»

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

Он выдает «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.

chepner 18.03.2022 21:42
Почему в 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
1
17
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы не можете прерывать оператор 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.

naajdai 18.03.2022 22:27

Это похоже на любое другое составное утверждение. Первая строка заканчивается двоеточием, и все строки с отступом не меньше, чем следующая строка, принадлежат составному оператору. Вы получили ошибку здесь, потому что тело было пустым.

chepner 18.03.2022 22:39

Ваш код совершенно неверен, вы не используете диспетчер контекста только для открытия файла, для этого у нас есть 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. Спасибо.

naajdai 18.03.2022 22:32

Память тут ни при чем. Новая область не создается; оператор with просто разграничивает вызовы методов __enter__ и __exit__ контекстного менеджера, вот и все.

chepner 18.03.2022 22:40

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