Мне нужно создать и записать в файл файл, имя которого введено пользователем. Пользователь присваивает файлу имя, поэтому программа не может иметь заданное имя файла для открытия. Я думал, что смогу сделать это, установив входную переменную. При этом создается файл, но затем мне нужно добавить в список дополнительные данные пользователя и записать этот список в файл пользователя.
[отрывок]
Вот очень сжатая версия. Полная версия имеет цикл 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()
Что именно означает «мне не позволяет»? Что происходит, когда вы запускаете код?
Метод .write
может быть выделен серым цветом, поскольку переменная bmiFile
изначально была строкой, а затем вы переназначили ее файловому объекту.
Вам нужно сообщить нам, что такое исключение, но вы должны использовать bmiEntry.write(str(i) + '\n')
, поскольку вы не можете добавлять строки к числам с плавающей запятой.
Одна из проблем заключается в том, что вы пытаетесь добавить строку к вещественному числу:
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")
Я попытался это сделать, но при попытке записи файла все равно выдавалась ошибка.
Что конкретно говорилось в исключении? В моем примере (только что отредактированном выше) я использовал строку формата, и она работала нормально: bmi_file.write(f"{i}\n")
. В вашем коде вы пытаетесь добавить string
к float
, что запрещено. Вы тоже можете сделать bmi_file.write(str(i) + '\n')
Вот и все!! Мне пришлось преобразовать его в строку, а затем записать в файл! Спасибо!!
Этот вопрос похож на: Запись списка в файл с помощью Python с переводами строк. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.