Python3 configparser начинается с первого аргумента arg, который должен быть байтами или кортежами байтов, а не str - PullRequest
1 голос
/ 12 марта 2019

Я делаю это:

tar = tarfile.open("stuff.tar")
cfg = configparser.ConfigParser(allow_no_value=True)
cfg.read_file(tar.extractfile("ook.ini"))

Файл "ook.ini" действительно находится в архиве "stuff.tar".

Тем не менее, я получаю это:

[…] ← Really not relevant stack trace. It's just where my code calls this.
File "/usr/local/lib/python3.7/configparser.py", line 1030, in _read
    if line.strip().startswith(prefix):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

Согласно документам, read_file() считывает и анализирует данные конфигурации из f, которые должны быть итеративными строками Unicode , так что то, что я передаю, должно быть хорошо, не так ли?

Что я делаю не так?

1 Ответ

3 голосов
/ 12 марта 2019

TarFile.extractfile(member) возвращает файл, открытый в режиме двоичный . Эквивалентом read_file является файл, открытый в режиме text . Таким образом, эти два не совпадают.

Вы можете заключить извлеченный файл в io.TextIOWrapper или в генератор, конвертирующий в Unicode:

tar = tarfile.open("stuff.tar")
cfg = configparser.ConfigParser(allow_no_value=True)
cfg.read_file(
    line.decode() for line in tar.extractfile("ook.ini")
)
...