Mám nějaké Python (3.8) kód, který má následující:
- Procházky adresáře a podadresáře daného cestu
- Najde všechny .csv soubory
- Najde všechny .csv soubory s Pct v souboru
- Připojí cestu a soubor
- Čte CSV
- Dodává názvem na df
- Concatonates všechny dfs spolu
Níže uvedený kód funguje, ale trvá dlouhou dobu (15 min) na spolknout všechny CSV - tam jsou 52,000 soubory. To by mohlo ve skutečnosti být dlouhá doba, ale chci snížit tento, stejně jako je to možné.
Můj současný pracovní kodex je níže:
start_dirctory='/home/ubuntu/Desktop/noise_paper/part_2/Noise/Data/' # change this
df_result= None
#loop_number = 0
for path, dirs, files in os.walk(start_dirctory):
for file in sorted(fnmatch.filter(files, '*.csv')): # find .csv files
# print(file)
if 'Pct' in file: # filter if contains 'Pct'
# print('Pct = ', file)
full_name=os.path.join(path, file) # make full file path
df_tmp= pd.read_csv(full_name, header=None) # read file to df_tmp
df_tmp['file']=os.path.basename(file) # df.file = file name
if df_result is None:
df_result= df_tmp
else:
df_result= pd.concat([df_result, df_tmp], axis='index', ignore_index=True)
#print(full_name, 'imported')
#loop_number = loop_number + 1
#print('Loop number =', loop_number)
Inspirován tento příspěvek (glob najít soubory rekurzivně) a tento příspěvek (jak zrychlit import csvs), snažil jsem se snížit čas, který je zapotřebí, aby spolknout všechny údaje, ale nemůžu přijít na to, způsob, jak integrovat filer pouze názvy souborů, které obsahují 'Pct a pak přidat názvem na df. To nemusí být možné s kódem z těchto příkladů.
Co jsem zkoušel níže (neúplné):
%%time
import glob
import pandas as pd
df = pd.concat(
[pd.read_csv(f, header=None)
for f in glob.glob('/home/ubuntu/Desktop/noise_paper/part_2/Noise/Data/**/*.csv', recursive=True)
],
axis='index', ignore_index=True
)
Otázka
Existuje nějaký způsob, jak mohu snížit čas na čtení a spolknout CSV je v mém kódu výše?
Díky!!!