Как записать имя файла пользовательского ввода в Python

Мне нужно создать и записать в файл файл, имя которого введено пользователем. Пользователь присваивает файлу имя, поэтому программа не может иметь заданное имя файла для открытия. Я думал, что смогу сделать это, установив входную переменную. При этом создается файл, но затем мне нужно добавить в список дополнительные данные пользователя и записать этот список в файл пользователя.

[отрывок]

Вот очень сжатая версия. Полная версия имеет цикл while с тремя операторами if. Я поместил команду записи вне цикла, потому что попытка поместить ее в блоки операторов if полностью нарушила ее.

РЕДАКТИРОВАТЬ. Я попытался это отредактировать на основе отзывов, но он все равно выдает ошибку исключения при попытке записи в файл. Я включаю больше кода, потому что мне интересно, не является ли это причиной проблемы из-за отсутствия оператора if?

while True:
       try:
              print("Select:\n1. Create a file\n2. Open a file to add results to\n3. Read results from file")
              choice = int(input())
              break
       except Exception as err:
              print(err)

if choice == 1:
    print("Please enter the name of the file you would like to create (Must include .txt in name):")
    bmiFile = input()
    bmiEntry = open(bmiFile, 'w')
    print("Creating", bmiFile)

    bmiEntry.close()
        #Age entry
    while True:
            try: 
                age = float(input("Please enter your age: "))
                if age <= 0:
                    raise TypeError ("Please enter a number greater than zero.")
                break
            except ValueError:
                    print("Invalid input.")
                    print("Please enter your age in numeric format.")
            except TypeError as err:
                    print(err)
            except:
                    print("Invalid input.")
bmiIndex.append(age)

try:
        bmiEntry = open(bmiFile, 'w')
        for i in bmiIndex:
                bmiEntry.write(i + '\n')
except:
        print('Error writing to file.')
        
bmiEntry.close()

Этот вопрос похож на: Запись списка в файл с помощью Python с переводами строк. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

J. Titus 12.07.2024 05:31

Что именно означает «мне не позволяет»? Что происходит, когда вы запускаете код?

John Gordon 12.07.2024 05:47

Метод .write может быть выделен серым цветом, поскольку переменная bmiFile изначально была строкой, а затем вы переназначили ее файловому объекту.

John Gordon 12.07.2024 05:54

Вам нужно сообщить нам, что такое исключение, но вы должны использовать bmiEntry.write(str(i) + '\n'), поскольку вы не можете добавлять строки к числам с плавающей запятой.

OneCricketeer 12.07.2024 06:29
Почему в 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
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Одна из проблем заключается в том, что вы пытаетесь добавить строку к вещественному числу:

bmiEntry.write(i + '\n')

Это вызовет исключение: TypeError: unsupported operand type(s) for +: 'float' and 'str'

Чтобы это исправить, нам нужно преобразовать число с плавающей запятой в строку либо явно, либо с помощью строки формата:

bmiEntry.write(str(i) + '\n')
# or ...
bmiEntry.write(f"{i}\n")

Другая проблема (из исходного вопроса) заключается в том, что вы переопределили имя файла (строку) в файловый объект:

bmiFile = input()
bmiFile = open(bmiFile, 'w')

Это работает, потому что Python в этом отношении гибок, но позже вы пытаетесь открыть файл, используя файловый объект вместо строки:

open(bmiFile, 'w')

Чтобы исправить это, вы можете записать имя файла отдельно от файлового объекта:

bmiFileName = input()
bmiFile = open(bmiFileName, 'w')

Затем используйте имя файла, чтобы открыть его позже в коде:

open(bmiFileName, 'w')

В качестве альтернативы вы можете сначала собрать вводимые пользователем данные, а затем сразу создать и записать файл:

bmi_index = []

while True:
    try: 
        age = float(input("Please enter your age: "))
        if age > 0: break
        print("Invalid input. Please enter a number greater than zero.")
    except ValueError:
        print("Invalid input. Age must be a numeric value.")
    except Exception as ex:
        print(f"Unexpected exception: {ex}")

bmi_index.append(age)

bmi_file_name = input(
    "Please enter the name of the file to create (must end in '.txt'): "
    ).strip()

if not bmi_file_name.endswith(".txt"): 
    bmi_file_name = f"{bmi_file_name}.txt"

with open(bmi_file_name, 'w') as bmi_file:
    for i in bmi_index:
        bmi_file.write(f"{i}\n")

Я попытался это сделать, но при попытке записи файла все равно выдавалась ошибка.

Stephanie Davi 12.07.2024 06:10

Что конкретно говорилось в исключении? В моем примере (только что отредактированном выше) я использовал строку формата, и она работала нормально: bmi_file.write(f"{i}\n"). В вашем коде вы пытаетесь добавить string к float, что запрещено. Вы тоже можете сделать bmi_file.write(str(i) + '\n')

Rufus L 12.07.2024 06:34

Вот и все!! Мне пришлось преобразовать его в строку, а затем записать в файл! Спасибо!!

Stephanie Davi 12.07.2024 06:49

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