Как запаковать несколько файлов в один zip архив на лету?
Есть фрейм данных, допустим на 1 млн строк. Нужно сохранить результат в один zip архив, содержащий 100 csv файлов, в каждом по 10к строк.
Реализовал такую функцию, которая делит фрейм на эти файлы, но архивирует каждый отдельно:
def result_writer(data):
chunk_size = 10000 #по сколько строк делить файл
counter = 0
for chunk in pd.read_csv(data, chunksize=chunk_size):
counter = counter + 1
chunk.to_csv(f'file_{str(counter)}.csv.gz',compression='gzip',index=False)
Как подправить, чтобы у меня получился один zip архив, а не сто?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Сам модуль Pandas поддерживает только архивы, содержащие единственный файл внутри.
If using
zip, the ZIP file must contain only one data file to be read in. Set to None for no decompression.
В вашем случае можно воспользоваться модулями io и zipfile, но опять же стандартный pd.read_csv() не сможет прочитать такой файл.
Вот рабочий пример:
import io
import zipfile
data_filename = "test.csv"
chunk_size = 10000
counter = 0
with zipfile.ZipFile("data.zip", "a", zipfile.ZIP_DEFLATED) as zp:
for chunk in pd.read_csv(data_filename, chunksize=chunk_size):
counter += 1
f = io.StringIO(chunk.to_csv(index=False))
zp.writestr(f'file_{counter:03d}.csv', f.getvalue())
f.close()