J'ai un script qui tire dans les données d'un fichier CSV, certaines manipulations et crée un fichier Excel de sortie. Mais c'est un processus fastidieux que je dois le faire pour plusieurs fichiers.
Question: Existe-t-il un moyen de gérer ce script sur plusieurs fichiers CSV et de créer une sortie de fichier Excel distincte pour chaque fichier d'entrée? p>
Je ne sais pas quoi essayer ici. J'ai lu que j'ai besoin d'utiliser un module appelé Glob mais je ne sais pas comment y aller. P>
Ce script fonctionne pour un seul fichier: P>
# Import libraries import pandas as pd import xlsxwriter # Set system paths INPUT_PATH = 'SystemPath//Downloads//' INPUT_FILE = 'rawData.csv' OUTPUT_PATH = 'SystemPath//Downloads//Output//' OUTPUT_FILE = 'rawDataOutput.xlsx' # Get data df = pd.read_csv(INPUT_PATH + INPUT_FILE) # Clean data cleanedData = df[['State','Campaigns','Type','Start date','Impressions','Clicks','Spend(INR)', 'Orders','Sales(INR)','NTB orders','NTB sales']] cleanedData = cleanedData[cleanedData['Impressions'] != 0].sort_values('Impressions', ascending= False).reset_index() cleanedData.loc['Total'] = cleanedData.select_dtypes(pd.np.number).sum() cleanedData['CTR(%)'] = (cleanedData['Clicks'] / cleanedData['Impressions']).astype(float).map("{:.2%}".format) cleanedData['CPC(INR)'] = (cleanedData['Spend(INR)'] / cleanedData['Clicks']) cleanedData['ACOS(%)'] = (cleanedData['Spend(INR)'] / cleanedData['Sales(INR)']).astype(float).map("{:.2%}".format) cleanedData['% of orders NTB'] = (cleanedData['NTB orders'] / cleanedData['Orders']).astype(float).map("{:.2%}".format) cleanedData['% of sales NTB'] = (cleanedData['NTB sales'] / cleanedData['Sales(INR)']).astype(float).map("{:.2%}".format) cleanedData = cleanedData[['State','Campaigns','Type','Start date','Impressions','Clicks','CTR(%)', 'Spend(INR)','CPC(INR)','Orders','Sales(INR)','ACOS(%)', 'NTB orders','% of orders NTB','NTB sales','% of sales NTB']] # Create summary summaryData = cleanedData.groupby(['Type'])[['Spend(INR)','Sales(INR)']].agg('sum') summaryData.loc['Overall Snapshot'] = summaryData.select_dtypes(pd.np.number).sum() summaryData['ROI'] = summaryData['Sales(INR)'] / summaryData['Spend(INR)'] # Push to excel writer = pd.ExcelWriter(OUTPUT_PATH + OUTPUT_FILE, engine='xlsxwriter') summaryData.to_excel(writer, sheet_name='Summary') cleanedData.to_excel(writer, sheet_name='Overall Report') writer.save()
4 Réponses :
quelque chose comme:
Vous pouvez exécuter ce script à l'intérieur d'A pour boucle:
for file in os.listdir(INPUT_PATH): if file.endswith('.csv') or file.endswith('.CSV'): INPUT_FILE = INPUT_PATH + '/' + file OUTPUT_FILE = INPUT_PATH + '/Outputs/' + file.[:-4] + 'xlsx'
Merci pour cela, c'était le moyen le plus simple de le faire!
Essayez ceci:
import glob files = glob.glob(INPUT_PATH + "*.csv") for file in files: # Get data df = pd.read_csv(file) # Clean data #your cleaning code # Push to excel writer = pd.ExcelWriter(OUTPUT_PATH + file.split("/")[-1].replace(".csv","_OUTPUT.xlxs", engine='xlsxwriter')
Vous pouvez utiliser Python's glob.glob () code>
pour obtenir tous les fichiers CSV d'un dossier donné. Pour chaque nom de fichier renvoyé, vous pouvez dériver un nom de fichier de sortie approprié. Le traitement de fichier pourrait être déplacé dans une fonction de la manière suivante: OS.Path.Join () code>
peut être utilisé comme moyen plus sûr de joindre des chemins de fichiers ensemble. p> p>
Dupliqué possible de en boucle via plusieurs fichiers CSV et produisant plusieurs sorties a>