2017-06-01 5 views
1

Also, ich habe versucht, eine verkettete Zeichenfolge in Python 3 auszuführen, und es hat funktioniert. Diese Funktion würde schließlich in eine (while) Schleife gehen, in der die Schleife bis zum aktuellen Monat zählt.Wahre Alternative zu exec() in Python

def all_installs_to_dataframe(month): 
    '''Imports csv's from different months to pandas dataframes''' 
    command = ["dataset = pd.read_csv('/path/file2017", "_overview.csv', sep=',', header=0, encoding='utf-16')"] 
    return (command[0] + month + command[1]) 
exec(all_installs_to_dataframe("05")) 

jedoch auf meine umfangreiche Forschung auf Stackoverflow scheint es, wie exec() nicht gemocht wird (außer für vertrauensvolle Eingabe). Daher würde ich gerne wissen, wie man das besser macht? Ich fand, dass viele gern Wörterbücher sind, habe ich versucht, diese und es würde mir auch einen String geben:

dict = {'start': "dataset = pd.read_csv('/path/file2017", 'month': "05", 'end': "_overview.csv', sep=',', header=0, encoding='utf-16')"} 
exec(dict['start']+dict['month']+dict['end']) 

die ich exec() wieder haben würde. Also, wie könnte ich das tun, ohne die exec() Aussage zu verwenden?

@nico: Ich hatte zunächst diese Schleife über alle meine Dateien (mit Datumzeit-Bibliothek):

month_date = 3 
while month_date - 1<date.today().month: 
    dataset = "dataset_%s" % (month_date) 
    function = "pd.read_csv('/path/file2017%s_overview.csv', sep=',', header=0, encoding='utf-16')" % (month_date) 
    dataset = function 
    month_date += 1 

Dann wurde mir klar, dass ich einen String zu erhalten, und es wird nicht funktionieren. Also benutze ich jetzt die exec() Funktion. Aber überall, wo ich lese, sollte ich es nicht benutzen, also wie könnte ich die exec() Funktion in dieser Schleife umgehen?

+0

Gibt es einen Grund, warum Sie den csv-Pfad nicht direkt senden? Sind die Befehle so unterschiedlich, dass dies nicht funktioniert? Ich versuche besser zu verstehen, was du machen willst. – nico

Antwort

1

Warum nicht den Befehl in der Funktion ausführen und den Dateinamen mit str.format anstatt exec erstellen?

def all_installs_to_dataframe(month): 
    '''Imports csv's from different months to pandas dataframes''' 
    dataset = pd.read_csv('/path/file2017{}_overview.csv'.format(month), sep=',', header=0, encoding='utf-16') 
+0

Merci für Ihre Antwort Jean-Francoise Fabre. Ich habe es getestet und das funktioniert einwandfrei. +1, wenn ich genug Reputation bekomme. – ccasimiro9444

+0

@ ccasimiro9444 Sie können die Antwort bereits akzeptieren. Das erfordert keine Privilegien :) –

+0

Akzeptiert, ich bin neu dazu :) – ccasimiro9444