IOError: [Errno 22] недопустимый режим («w») или имя файла

Я получаю эту ошибку при попытке создать файл. Он предназначен для того, чтобы взять созданный файл .csv и поместить его в обычный текстовый файл.

Я хотел бы, чтобы он создал новый файл после его запуска с отметкой даты и времени, но я, кажется, получаю Errno 22 при попытке создать файл.

Любые идеи?

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

person SergeProtector    schedule 09.01.2015    source источник
comment
time.strftime("%X") возвращает строку типа '12:57:03'. Вы уверены, что ваша ОС разрешает имена файлов, содержащие двоеточие? аналогично, %x даст вам '01/09/15'. У вас уже настроены каталоги Bursarcodes_01 и 09, которые будут содержать ваш файл 15_12:57:03.txt?   -  person Kevin    schedule 09.01.2015
comment
Это была именно проблема. После внесения указанных исправлений он работает как шарм.   -  person SergeProtector    schedule 09.01.2015


Ответы (2)


Вы не можете использовать косую черту (/) и двоеточие (:, но разрешено в Unix) в имени вашего файла, но они именно то, что strftime генерирует в своем выводе.

Python пытается вам помочь, он говорит:

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

Замените time.strftime("%x") на это:

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

...и time.strftime("%X") с этим:

time.strftime("%X").replace(':', '_')
person Andrew Dunai    schedule 09.01.2015
comment
Вау, спасибо за быстрый ответ, и это отлично работает! - person SergeProtector; 09.01.2015
comment
@SergeProtector рад, что это помогло! - person Andrew Dunai; 09.01.2015

Очищенная и расширенная версия:

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:])

Теперь вы также можете запустить его из командной строки.

Обратите внимание, что если какие-либо элементы данных в вашем CSV-файле содержат неэкранированные одинарные кавычки ('), вы получите недопустимый sql.

person Hugh Bothwell    schedule 09.01.2015
comment
Вау, это впечатляет. Если вы не могли сказать по моему коду, то теперь точно знаете, что я полный новичок в Python. Я поиграю с этим, спасибо за вашу помощь. - person SergeProtector; 09.01.2015