Может ли pandas читать и архивировать в архиве? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть архивный файл (archive.tar.gz), который содержит несколько архивных файлов (file.txt.gz).

Если я сначала извлеку файлы .txt.gz в папку, я могу затем откройте их с помощью pandas напрямую, используя:

import pandas as pd

df = pd.read_csv('file.txt.gz', sep='\t', encoding='utf-8')

Но если я исследую архив с использованием библиотеки tarfile, то это не сработает:

import pandas as pd
import tarfile

tar = tarfile.open("archive.tar.gz", "r:*")
csv_path = tar.getnames()[1]
df = pd.read_csv(tar.extractfile(csv_path), sep='\t', encoding='utf-8')

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Возможно ли это делать?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Когда вы открываете файл по имени файла, Pandas сможет сделать вывод , что он сжат с помощью gzip из-за расширения *.gz в имени файла.

Когда Вы передаете ему объект файла, вам нужно явно сообщить ему о сжатии, чтобы он мог распаковать его при чтении файла.

Это должно работать:

df = pd.read_csv(
    tar.extractfile(csv_path),
    compression='gzip',
    sep='\t',
    encoding='utf-8')

Для получения более подробной информации см. запись об аргументе «сжатие» в документации для read_csv () .

1 голос
/ 21 февраля 2020

read_csv, вероятно, пытается интерпретировать ввод как имя файла. Если вы оберните извлеченный файл в io.BytesIO, я подозреваю, что вы сможете заставить его обрабатывать его так же, как дескриптор открытого файла

from io import BytesIO
df = pd.read_csv(BytesIO(tar.extractfile(csv_path)), ...)
...