2015-01-09 17 views
6

Ich bekomme diesen Fehler beim Versuch, eine Datei zu erstellen. Es wurde entwickelt, um eine erstellte .csv-Datei aufzunehmen und in eine reine Textdatei zu schreiben.IOError: [Errno 22] ungültiger Modus ('w') oder Dateiname

Ich möchte es eine neue Datei erstellen, nachdem es mit dem Datums- und Zeitstempel ausgeführt wurde, aber ich erhalte anscheinend das Errno 22 beim Versuch, die Datei zu generieren.

Irgendwelche Ideen?

import csv 
import time 

f = open(raw_input('Enter file name: '),"r") 

saveFile = open ('Bursarcodes_'+time.strftime("%x")+ '_'+time.strftime("%X")+ 
       '.txt', 'w+') 

csv_f = csv.reader(f) 

for row in csv_f: 
    saveFile.write('insert into bursarcode_lookup(bursarcode, note_id)' + 
        ' values (\'' + row[0] + '\', ' + row[1] + ')\n') 

f.close() 

saveFile.close() 
+3

'time.straftime ("% X ")' gibt eine Zeichenfolge wie ''12: 57: 03'' zurück. Sind Sie sicher, dass Ihr Betriebssystem Dateinamen mit einem Doppelpunkt erlaubt? Ebenso wird% x dir "01/09/15" geben. Hast du schon die Directories "Bursarcodes_01" und "09" eingerichtet, die deine "15_12: 57: 03.txt" -Datei enthalten? – Kevin

+0

Das war genau das Problem. Nach den angegebenen Korrekturen wirkt es wie ein Zauber. – SergeProtector

Antwort

6

Sie können keine Schrägstriche haben (/) und Doppelpunkte (:, aber in Unix erlaubt) im Dateinamen, aber sie sind genau das, was strftime in ihrem Ausgang.

Python versucht, Ihnen zu helfen, heißt es:

No such file or directory: 'Bursarcodes_01/09/15_19:59:24.txt' 

ersetzen time.strftime("%x") mit diesem:

time.strftime("%x").replace('/', '.') 

... und time.strftime("%X") mit diesem:

time.strftime("%X").replace(':', '_') 
+1

Wow danke für die schnelle Antwort und es funktioniert super! – SergeProtector

+1

@SergeProtector froh, dass es geholfen hat! –

1

A cleaned- up und erweiterte Version:

import csv 
import sys 
import time 

def make_output_fname(): 
    # Thanks to @Andrew: 
    return time.strftime("Bursarcodes_%x_%X.txt").replace("/", "-").replace(":", "-") 

def main(csv_fname=None, outfname=None, *args): 
    if not csv_fname: 
     # first arg not given - prompt for filename 
     csv_fname = raw_input("Enter .csv file name: ") 

    if not outfname: 
     # second arg not given - use serialized filename 
     outfname = make_output_fname() 

    with open(csv_fname) as inf, open(outfname, "w") as outf: 
     incsv = csv.reader(inf) 
     for row in incsv: 
      outf.write(
       "insert into bursarcode_lookup(bursarcode, note_id) values ('{0}', '{1}')\n" 
       .format(*row) 
      ) 

if __name__=="__main__": 
    # pass any command-line arguments to main() 
    main(*sys.argv[1:]) 

Sie können es jetzt auch über die Befehlszeile ausführen.

Beachten Sie, dass, wenn beliebige Datenelemente in Ihrer CSV-Datei unescaped einfache Anführungszeichen enthalten (') Sie ungültige SQL erhalten.

+0

Wow, das ist beeindruckend. Wenn Sie das nicht an meinem Code erkennen können, dann wissen Sie jetzt, dass ich ein absoluter Anfänger bei Python bin. Ich werde mit diesem Dank für Ihre Hilfe spielen. – SergeProtector