Помогите решить задачу Phyton, получает на вход название файла и проверяет его

Задача 3. Файлы

В одной IT-компании существует негласный закон об именовании текстовых документов:

Название файла не должно начинаться на один из специальных символов: @№$%^&*().
Файл заканчивается расширением .txt или .docx.

Напишите программу, которая получает на вход полное название файла и проверяет его по этим правилам.

Пример 1:

Название файла: @example.txt

Ошибка: название начинается на один из специальных символов

Пример 2:

Название файла: example.ttx

Ошибка: неверное расширение файла. Ожидалось .txt или .docx

Пример 3:

Название файла: example.txt

Файл назван верно.

вот что я смог написать но это думаю не правильно

file=input('Введите имя файла: ')
if not file.endswith('.txt','.docx'):
  print('Ошибка: неверное расширение файла')
if file.startswith(' @№$%^&*()'):
  print('Ошибка:недопустимый символ')
else:
  print('Файл назван верно')

Так а зачем думать, запустите и проверьте )

запустил и не правильно

Так а что именно, как проявляет себя неправильность?

Наверное нужно имя файла обрабатывать как строку и проверять на наличие спецсимволов в строке.

Ну дык а как иначе?)

Автор вроде бы и пытался так сделать. Но почему-то решил не рассказывать в чем именно проблема с текущим решением.

proh_elements = list('@№$%^&*()')

print('Название файла не должно начинаться на один из специальных символов: @№$%^&*().'
      'Файл заканчивается расширением .txt или .docx.')
file_name = input('Введите название файла: ')
if not file_name.endswith('.txt' or '.docx'):
    print('Ошибка: неверное расширение файла. Ожидалось .txt или .docx')
for i in range(len(proh_elements)):
    if file_name.startswith(proh_elements[i]):
        print('Ошибка: название начинается на один из специальных символов')
        break
    else:
        print('Файл назван верно:', file_name)
        break

:thinking:
Это ж получится, что будет выход из цикла после первой итерации если символ разрешен.
То есть например %example.txt будет считаться разрешенным, проверка не дойдет до символа %.

1 лайк

это неверно, что бы здесь ни подразумевалось. верно:

file.endswith(('.txt','.docx'))
1 лайк

эта штука не создаст кортеж внутри вызова функции. оно выполнит логическое или над этими 2мя строками как над бульками. в параметр уйдет ‘.txt’
иными словами:
file_name.endswith(’.txt’ or ‘.docx’) то же что и file_name.endswith(’.txt’)
file_name.endswith(’.txt’ or ‘.docx’) и file_name.endswith(’.txt’) or file_name.endswith(’.docx’) - разные вещи

1 лайк
elements = list('@№$%^&*().')
flag = True

print('Название файла не должно начинаться на один из специальных символов: @№$%^&*().'
      'Файл заканчивается расширением .txt или .docx.')
file_name = input('Введите название файла: ')
if not file_name.endswith(('.txt', '.docx')):
    print('Ошибка: неверное расширение файла. Ожидалось .txt или .docx')
for i in range(len(elements)):
    if file_name.startswith(elements[i]):
        print('Ошибка: название начинается на один из специальных символов')
        flag = False
if flag is not False:
    print('Файл назван верно.')

Тогда так. Вы уж извините, пару месяцев питон изучаю.

да ниче. я сам питон выучил тока недавно, пока в больнице лежал. ))

А вообще, делается все просто: пишутся юнит тесты, проверяющие все кейсы, которые придут в голову (они в условии перечислены). Потом пишется код, который должен решать поставленную задачу. Для подобных задач такой подход более чем норм. Да, задачка мелкая, да, тесты по объему будут больше самого решения, но хорошие привычки в себе нужно вырабатывать. В итоге получаем и решение и пруфы, что решение валидное. Ни один препод против не будет.
Да и в коммерческой разработке подход обоснования правильности кода юнит, интеграционными, компонентными тестами применяется во всех серьезных проектах.

Лучше поздно, чем никогда. Пускай будет для других кто ищет данную задачу.

document = input("Название файла: ")

if document.startswith(("@", "№", "$", "%", "^", "&", "*", "(", ")")):
    print("Ошибка: название начинается на один из специальных символов")
elif not document.endswith('.txt') or document.endswith('.docx'):
    print("Ошибка: неверное расширение файла. Ожидалось .txt или .docx")
else:
    print("Файл назван верно", document)

bayye, и все-таки elif not document.endswith(('.txt', '.docx')):, а то файлы с расширением docx считаются неверными.