Получаю ошибку ValueError: not enough values to unpack (expected 2, got 1)
from sys import argv
script, filename = argv
txt = open(filename)
print(f"Содержимое файла {filename}:")
print(txt.read())
print("Снова введите имя файла:")
file_again = input("> ")
txt_again = open(file_again)
print(txt_again.read())
Ответы (1 шт):
Ну, что же давайте разберем.
Документация по argv можно найти на сайте с документацией. Другими словами argv будет содержать аргументы командной строки.
Проубем запустить ваш код с одним лишь добавлением строки вывода с содержанием самого argv
from sys import argv
print(argv) # здесь смотрим, что содержит argv
script, filename = argv
txt = open(filename)
print(f"Содержимое файла {filename}:")
print(txt.read())
print("Снова введите имя файла:")
file_again = input("> ")
txt_again = open(file_again)
print(txt_again.read())
вызов
C:\...> py t.py
вывод ожидаемо (файл t.py у меня)
['t.py']
Traceback (most recent call last):
File "C:\...\t.py", line 3, in <module>
script, filename = argv
ValueError: not enough values to unpack (expected 2, got 1)
Ошибка говорит, что у вас не достаточно аргументнов передано из командной строки. Т.е. ожидается 2, но получено всего лишь 1. Это можно увидеть в выводе содержания argv. А теперь передадим при запуске файла t.py дополнительный аргумент, который ожидается распаковкой script, filename = argv.
Ну так давайте передадим дополнительный аргумент. Вызов:
py t.py t.py
Вывод
C:\...>py t.py t.py
['t.py', 't.py']
Содержимое файла t.py:
Traceback (most recent call last):
File "C:...\t.py", line 6, in <module>
print(txt.read())
File "C:...cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 194: character maps to <undefined>
Работа уже дошла до строки, которая содержит print(txt.read()). Это не мое дело, поэтому просто закомментирую ее и запущу по новой:
C:\...>py t.py t.py
['t.py', 't.py']
Содержимое файла t.py:
Снова введите имя файла:
>
Результат, который вы ожидаете, наверное.
PS: я абослютно не вдавался в логику ваших действий. Я скорее показал метод, как поправить некорректное поведение.
UPD
если не игнорировать ошибку кодировки, то конечное решение:
from sys import argv
script, filename = argv
txt = open(filename, encoding="utf8")
print(f"Содержимое файла {filename}:")
print(txt.read())
print("Снова введите имя файла:")
file_again = input("> ")
txt_again = open(file_again, encoding="utf8")
print(txt_again.read())
Вызов:
C:\...>py t.py test_read.txt
Вывод:
Содержимое файла test_read.txt:
line 1
line 2
here is line 3
Снова введите имя файла:
>