2011-10-25 22 views
-2

あるフォルダにいくつかのzipファイルがあります。私はそれらを処理するためのスクリプトを持っています。データベースに書き込まれるデータは、異なるファイル内にあり、次のように、その構造は次のとおりです。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ファイルから始めます。

+0

に動作します。 – codeape

+1

else条件からの戻り値を削除します。そのためにコードは停止します。 – spicavigo

+0

申し訳ありませんが、あなたのコードには多くの問題があります: "if filelist:"は必要ありません。リストを反復しているだけなので、リストが空の場合は問題ありません。また、ファイル名を取得するには、os.path.splitext()を使用する必要があります。ファイル処理ループなどからデータファイルを読み取る必要があります。 –

答えて

0

私のコードは完璧ではありません。問題はelseでした。私はコード全体の最後まで移動しました。初心者の間違いだった。私はtry-catchを挿入して、1つの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("\r\n", "") 
       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) 

私はそれが完璧ではない知っているが、あなたは答えを得るためのより良いチャンスがあります書式設定を改善した場合、それは:)

+0

解決策をお祝いします。あなたができるときは、他の人があなたの成功から学ぶかもしれないようにあなたの答えを「受け入れ」とマークしてください。乾杯〜 –

関連する問題