Python — управление файлами и обработка нескольких zip-файлов

#python #file

#python #файл

Вопрос:

У меня есть несколько zip-файлов в папке. У меня есть скрипт для их обработки. Данные, которые должны быть записаны в базу данных, находятся в другом файле, и его структура выглядит следующим образом:

 some_text;database;file_name
some_text2;database2;file_name2
....
 

Каков наилучший способ обработки этого файла? Также должно быть сообщено сообщение об ошибке, если в этом файле нет совпадающего имени zip-файла.

Мой текущий код:

 filelist = glob.glob(os.path.join(rootdir, '*.zip'))
if filelist:
    for file in filelist:
        print "Working on file ", file
        #get only file name without .zip for compare
        aa = file.split(sl)
        bb = aa[len(aa) -1]
        cc = bb.split(".")
        ime_sole = cc[0]

        fle = codecs.open(rootdir   sl   'portal_schools.txt',
                          'r',encoding="cp1250")
        line = fle.readline()

        # Read lines 
        for line in iter(fle):
            #print line,
            a,b,c = line.split(";")
            if c == ime_sole:
                print c
                database = str(b)
                #distdir = str(c)
             else:
                 print "some text"
                 return


        fle.close()
 

Но это не удается, потому что оно читается построчно. Если в первой строке нет совпадения, код останавливается. Мне нужно, чтобы это продолжалось через файл, а затем, после того, как все будет сделано, начните с нового zip-файла.

Комментарии:

1. Если вы улучшите форматирование, у вас будет больше шансов получить ответ.

2. Удалите возврат из условия else. Из-за этого код останавливается.

3. Извините, но с вашим кодом много проблем: вам не нужен этот «if filelist:», поскольку вы просто повторяете список, что будет нормально, если список пуст. Вы также должны использовать os.path.splitext() для получения имени файла. Вы должны прочитать свой файл данных из цикла обработки файлов и т. Д. И т. Д.

Ответ №1:

Я знаю, что мой код далек от совершенства. Проблема заключалась в else . Я переместил его в конец всего кода. Это была ошибка новичка. Я также вставил try-catch, чтобы в случае сбоя в одном zip-файле следующий все еще обрабатывался. Теперь это выглядит примерно так:

 filelist = glob.glob(os.path.join(rootdir, '*.zip'))
 if filelist:
    for file in filelist:
        try:
            aa = file.split(sl)
            #print "aa ",aa
            bb = aa[len(aa) -1]
            #print "bb ", bb
            cc = bb.split(".")
            #print "cc ", cc
            ime_sole = cc[0]
            #print "imesole ", ime_sole

    fle = codecs.open(rootdir   sl    'portal_schools.txt','r',encoding="cp1250")
            #line = fle.readline()

            data = []

            for line in iter(fle):
                line = line.replace("rn", "")
                x = line.split(";")
                data.append(x)

            result = [element for element in data if element[2] == ime_sole]
            fle.close()
            #print result


            if result:
                database =  result[0][1]

                vnos_data = "Podatki za %s , se vpisujejo v bazo %s " % (ime_sole, database)


                host ="####"
                user="####"
                password = "####"


                iUrnik_tables = iUrnik_tables_fromzip.Tables(defdir,file,sl,host,database,user,password)

                id_skripte =iUrnik_tables[0]
                date_begin = iUrnik_tables[1]
                date_end = iUrnik_tables[2]
                iUrnik_all_fromzip.FileWork(defdir,file,sl,host,database,user,password)


                iUrnik_itt_zip.Proces(defdir,file,sl,host,database,user,password,id_skripte,date_begin,date_end)


                trenutek  = datetime.datetime.now()
                trenutek = trenutek.strftime("%Y%m%d%H%M")

                newfilename = os.path.splitext(file)[0] 
                newfilename = newfilename  "_"   str(trenutek)   os.path.splitext(file)[1]


                folder = defdir   sl   ime_sole   sl   "archive"

                destination = folder    sl

                novoimezipa= destination   newfilename.split(sl)[-1]

                if not os.path.exists(folder):
                    os.makedirs(folder)
                    os.chdir(folder)


                shutil.copy(file,destination)

                old = destination   file.split(sl)[-1]
                os.rename(old , novoimezipa )


                os.remove(file)



            else:
                nothing :)

                #return
        except:
            print sys.exc_info()


else:
    vnos_nodata= u"V mapi %s ni podatkov za prenos" % (rootdir)
    Logging(defdir, sl, vnos_nodata)
 

Я знаю, что это не идеально, но это работает 🙂

Комментарии:

1. Поздравляю с решением. Когда вы сможете, пожалуйста, отметьте свой ответ как «принятый», чтобы другие могли извлечь уроки из вашего успеха. Приветствия ~