#python #zip #temporary-files
Вопрос:
Я пытаюсь распаковать zip-файл, содержащий csv-файл, и записать все строки из csv-файла в NamedTemporaryFile. Затем распечатайте строки из временного файла, чтобы убедиться, что он правильно написал нужные строки. Это мой текущий код, который при вызове «печать(строка)» возвращает пустое значение.
with zipfile.ZipFile(file_name) as zip_fp:
for item in zip_fp.namelist():
temp_file = NamedTemporaryFile()
with zip_fp.open(item) as fp:
with open(temp_file.name, mode='wb ') as temp_fp:
temp_fp.writelines(fp.readlines())
for line in temp_fp:
print(line)
Пожалуйста, помогите.
Ответ №1:
Это потому temp_fp.writelines(fp.readlines())
, что он записал все строки в файл, и курсор теперь находится в конце файла, так что вы ничего не получите. Попробуйте приведенный ниже код (последние 3 строки добавлены в ваш код).:
with zipfile.ZipFile(file_name) as zip_fp:
for item in zip_fp.namelist():
temp_file = NamedTemporaryFile()
with zip_fp.open(item) as fp:
with open(temp_file.name, mode='wb ') as temp_fp:
temp_fp.writelines(fp.readlines())
with open(temp_file.name, mode='r') as temp_fp:
for line in temp_fp:
print (line)
ИЛИ — seek
в начало файла и прочитайте всю строку:
with zipfile.ZipFile(file_name) as zip_fp:
for item in zip_fp.namelist():
temp_file = NamedTemporaryFile()
with zip_fp.open(item) as fp:
with open(temp_file.name, mode='wb ') as temp_fp:
temp_fp.writelines(fp.readlines())
# SEEK TO START OF FILE
temp_fp.seek(0,0)
for line in temp_fp:
print (line)
Комментарии:
1. Оба этих ответа сохраняют zip-файл открытым, когда в этом нет необходимости. Кроме того, firs ошибается, так как он открывает файл в режиме записи , а не чтения
2. Ой, копипаст, в любом случае обновлена вторая часть, чтобы открыть файл в режиме чтения
3. Нет проблем 🙂 Рад, что смог помочь!
Ответ №2:
Причина в том, что запись ведется до конца файла, поэтому читать больше нечего. Этот код:
with zip_fp.open(item) as fp:
with open(temp_file.name, mode='wb ') as temp_fp:
temp_fp.writelines(fp.readlines())
for line in temp_fp:
print(line)
Делает следующее:
- откройте молнию как fp:
- откройте временный файл как temp_fp
- пишите с начала temp_fp (так как мы не находимся в режиме добавления).
- прочитайте что-нибудь после окончания файла (т. е. Ничего).
Нет причин проверять, сработало ли письмо: оно сработает. Однако, если бы вы хотели это сделать, что-то подобное сработало бы:
with zip_fp.open(item) as fp, temp_file.open("wb ") as tmpf:
for line in fp:
tmpf.writelines([line])
with tmp_file.open("rb") as tmpf:
for line in tmpf:
print(line)
Обратите внимание на несколько исправлений здесь—использование объектов path на всем протяжении, несколько строк в одной строке и предотвращение потери оперативной памяти путем прямой записи.
Кстати, должны ли они быть в двоичном режиме?