Конвертируйте сотни CSV-файлов в hdf5-файлы - PullRequest
0 голосов
/ 18 апреля 2020

Я нашел много ответов на этот вопрос, но не на то, что я хочу сделать конкретно. У меня много csv-файлов, несколько строк размером более 200 месяцев, всего ~ 70 Go данных, и я хотел бы преобразовать их в hdf5-файлы.

Я нашел способы которые создают большой фрейм данных и объединяют их все вместе, но мои данные слишком велики, чтобы поместиться в один фрейм данных, используя решение, показанное здесь. https://datascience.stackexchange.com/questions/53125/file-converter-from-csv-to-hdf5

Я пытаюсь сделать что-то вроде 1 кадра данных на файл и преобразовать их все в файлы hdf5, чтобы у меня было одинаковое количество файлов h5 и csv, но я не Я не знаю, что это правильное решение, так как я не думаю, что мой компьютер может хранить все это в памяти.

Что-то подобное я обнаружил в другом SO-потоке, чтобы поместить все csv в один кадр данных перед преобразованием:

from os import listdir

filepaths = [f for f in listdir("./data") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths))

не работает, потому что слишком много файлов / слишком тяжелый.

Если вам известно о другом решении, пожалуйста, помогите,

Спасибо

РЕДАКТИРОВАТЬ :

Спасибо за ответы, похоже, работает с этим кодом:

for f in tqdm (listdir("E:\\Data\\Trades\\history")):
    if f.endswith('.csv'):
        pd.read_csv(f, 'rb').to_hdf('E:\\Data\\Trades\\hdf5_test.h5', key=f)

Но я получаю эту ошибку FileNotFoundError: [Errno 2] No such file or directory: 'trade_20141123.csv' Это имя первого файла в списке.

Я также получаю это предупреждение в jupyter:

ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
  pd.read_csv(f, 'rb').to_hdf('E:\\Data\\Trades\\hdf5_test.h5', key=f)
C:\Users\Sam\anaconda3\envs\vaex_env\lib\site-packages\tables\path.py:155: NaturalNameWarning: object name is not a valid Python identifier: 'trade_20141122.csv'; it does not match the pattern ``^[a-zA-Z_][a-zA-Z0-9_]*$``; you will not be able to use natural naming to access this object; using ``getattr()`` will still work, though
  check_attribute_name(name)

Нужно ли переименовывать все файлы? Я не уверен, что это проблема, но если это проблема с каким персонажем?

Приветствия

1 Ответ

2 голосов
/ 18 апреля 2020

Не используйте списочное понимание. просто используйте al oop, который читает, конвертирует и записывает каждый файл, чтобы вы не получили слишком много файлов или не хватило памяти.

Редактировать 1: Сделайте что-то вроде:

for f in listdir("./data"):
    if f.endswith('.csv'):
        pd.read_csv(f).to_hdf(...)

Взгляните на эту ссылку .

Редактировать 2: попробуйте что-то вроде этого:

import numpy as np
import pandas as pd
import os, shutil, time, h5py

root_dir = './data/'  # Unique results directory
filepath = os.path.join(root_dir, 'file{0:03d}.csv')
hdfpath = os.path.join(root_dir, 'results.h5')

n_files = 10
n_rows = 100
n_cols = 10

if True:
    # Clear previous results
    if os.path.isdir(root_dir):
        shutil.rmtree(root_dir)
        os.makedirs(root_dir)
    for i in range(n_files):
        print("write csv file:",i)
        results = np.random.random((n_rows, n_cols))
        np.savetxt(filepath.format(i), results, delimiter=',')

# Convert the many csv files into a single hdf file
start_time = time.time()

for f in os.listdir("./data"):
    if f.endswith('.csv'):
       x='./data/'+f
       y='./data/'+f+'.hd5'
       df=pd.read_csv(x, 'rb',engine='python')
       df.to_hdf(y, key=f)

print('%s seconds' % (time.time() - start_time))
...