0
votes

Boucle via plusieurs fichiers CSV et exécuter un script

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 :


1
votes

quelque chose comme: xxx


xxx

0 commentaires

1
votes

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'


1 commentaires

Merci pour cela, c'était le moyen le plus simple de le faire!



0
votes

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')


0 commentaires

1
votes

Vous pouvez utiliser Python's glob.glob () 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: xxx

OS.Path.Join () peut être utilisé comme moyen plus sûr de joindre des chemins de fichiers ensemble.


0 commentaires