Saya menemukan banyak jawaban untuk pertanyaan ini tetapi tidak untuk apa yang ingin saya lakukan secara khusus. Saya memiliki banyak file csv, beberapa beberapa baris beberapa lebih dari 200 bulan, dengan total ~70Go data, dan saya ingin mengubahnya menjadi file hdf5.

Saya menemukan cara untuk membuat kerangka data besar dan menggabungkan semuanya, tetapi data saya terlalu besar untuk ditampung dalam kerangka data tunggal, menggunakan solusi yang ditunjukkan di sini. https://datascience.stackexchange.com/questions/53125/file-converter- dari-csv-ke-hdf5

Saya mencoba melakukan sesuatu seperti 1 kerangka data per file dan mengonversi semuanya menjadi file hdf5 sehingga saya memiliki jumlah file h5 dan csv yang sama, tetapi saya tidak tahu bahwa itu adalah solusi yang tepat, karena menurut saya bukan komputer dapat menyimpan semua ini dalam memori.

Sesuatu seperti itu saya temukan di utas SO lain untuk meletakkan semua csv dalam satu kerangka data sebelum mengonversi:

from os import listdir

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

Tidak berfungsi karena terlalu banyak file/terlalu berat.

Jika Anda mengetahui solusi lain, tolong bantu,

Terima kasih

EDIT:

Terima kasih atas jawabannya, sepertinya berfungsi dengan kode ini:

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)

Tapi saya mendapatkan kesalahan ini FileNotFoundError: [Errno 2] No such file or directory: 'trade_20141123.csv' Itulah nama file pertama dalam daftar.

Saya juga mendapatkan peringatan ini di 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)

Apakah saya harus mengganti nama semua file? Saya tidak yakin itu masalahnya, tetapi jika itu adalah karakter apa masalahnya?

Bersulang

0
Sam99 18 April 2020, 03:46

1 menjawab

Jawaban Terbaik

Jangan gunakan pemahaman daftar. cukup gunakan loop yang membaca, mengonversi, dan menulis setiap file sehingga Anda tidak akan mendapatkan terlalu banyak file atau kehabisan memori.

Sunting 1: Lakukan sesuatu seperti:

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

Lihat tautan ini.

Sunting 2: coba sesuatu seperti ini:

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))
2
Ray Tayek 19 April 2020, 07:03