Я пытаюсь прочитать несколько файлов csv.gz в фрейм данных, но он работает не так, как я ожидал.
Когда я использую этот шаблон подстановки:
pl.read_csv('folder_1\*.csv.gz')
Он возвращает эту ошибку:
ComputeError: невозможно сканировать сжатый CSV-файл; используйте read_csv для сжатых данных
Эта ошибка произошла со следующим стеком контекста: >[1] Ошибка сканирования CSV [2] ввод «выбрать» не удалось разрешить
Что странно, учитывая, что я использую именно ту функцию, которую они предлагают. Однако передача этого шаблона подстановки для CSV работает совершенно нормально:
pl.read_csv('folder_1\*.csv')
Как я могу обойти это? Сейчас я просто использую glob.glob() и перебираю список, но думаю, что без него он будет выглядеть аккуратнее.
Похоже, там тоже была опубликована ошибка github.com/pola-rs/polars/…
Когда я передаю glob-строку blah/blah/blah/*.csv.gz
pl.read_csv
, он передает это pl.scan_csv
, потому что это glob-строка. См. строку 514 и последующие поля Polars.io.csv.functions в версии 1.1.0.
Здесь есть два отдельных вопроса:
Как читать несколько CSV-файлов? Вы можете прочитать несколько CSV-файлов, передав строку glob в pl.scan_csv
. Он возвращает ленивый фрейм данных, который затем можно оценить с помощью .collect()
.
Как читать сжатый CSV? Вы можете читать определенные типы сжатых CSV-файлов с помощью pl.read_csv
(заметным исключением являются csv.xz
, которые не работают).
Но сложите два вопроса вместе, и окажется, что pl.scan_csv
вообще не поддерживает сжатые файлы. Это открытый вопрос.
Если вам нужен однострочник для чтения CSV-файлов, вам придется прибегнуть к чему-то вроде понимания списка с нетерпеливым выполнением:
from glob import glob
l = [pl.read_csv(i) for i in glob('*.csv.gz')]
Затем сделайте все, что хотите, со списком CSV (например, pl.concat).
pl.scan_csv
не поддерживает glob-строки github.com/pola-rs/polars/issues/9601 , куда отправляется ваша glob-строка. Вам необходимо устранить неоднозначность вашей строки glob в одном файле.