2017-07-05 1 views
0

私は現在、Python 3.6(Spyderの下)、より正確にはsqlite3(3.14.2)を使用してデータベースを構築しようとしています。この最後のモジュールはデータベースにリスト挿入を有効にするように設計されていないので、リストを文字列に変換するためにjson(2.0.9)モジュールを使用しています。以下の別のデータベースからデータを転送するために使用される機能や、どこで作成し、最初にリストを挿入し、私の奇妙な結果を返します:私は(基本「NAME3初めてそれを起動するとjson.loads(string)の結果はまだ文字列です

def database_concatenation(): 
    global log,name2,name3,timefin,path 
    conn = sqlite3.connect(path+name2) 
    cursor = conn.cursor() 
    conn2 = sqlite3.connect(path+name3) 
    cursor2 = conn2.cursor() 
    cursor.execute("""select sqlite_version()""") 
    print(cursor.fetchall()) 
    cursor.execute("""SELECT * FROM {}""".format(name2)) 
    for dataline in cursor.fetchall(): 
     cursor2.execute(""" 
         SELECT * FROM {} 
        WHERE (
        timestp = ? 
        AND idq = ? 
        AND idz = ? 
        AND portq = ? 
        AND portz = ? 
        AND prot = ?); 
        """.format(name3) , (dataline[0],dataline[1],dataline[2],dataline[3],dataline[4],dataline[5])) 
     result = cursor2.fetchone() 

     if result == None: 
      with open(path+log,"a") as login: 

       login.write(timefin + " Warning ! Unusual connection :" + str(dataline)+ '\n') 


      cursor2.execute(""" 
         INSERT INTO {}(timestp, 
         idq, 
         idz, 
         portq, 
         portz, 
         prot, 
         Leftmean, 
         Leftstdev, 
         Leftmean10, 
         Leftstdev10, 
         Rightmean, 
         Rightstdev, 
         Rightmean10, 
         Rightstdev10, 
         nbdays) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);""".format(name3), (dataline[0],dataline[1],dataline[2],dataline[3],dataline[4],dataline[5],dataline[6],0,json.dumps([dataline[6]]),0,dataline[7],0,json.dumps([dataline[7]]),0,1)) 

     else: 
      print(result[8]) 
      Leftmean10 = json.loads(result[8]) 
      print(Leftmean10) 
      Rightmean10 = json.loads(result[12]) 
      print(type(Leftmean10)) 

      nbdays = result[14] 
      aL,bL = intervalle_confiance(result[6],result[7],result[14]) 
      aL10,bL10 = intervalle_confiancebis(Leftmean10,result[9],min(nbdays,10)) 
      aR,bR = intervalle_confiance(result[10],result[11],result[14]) 
      aR10,bR10 = intervalle_confiancebis(Rightmean10,result[13],min(nbdays,10)) 
      rhwmny = dataline[7] 
      lhwmny = dataline[6] 





     if nbdays >= 10: 
      Leftmean10.pop(0) 
      Rightmean10.pop(0) 
      Leftmean10.append(dataline[6]) 
      Rightmean10.append(dataline[7]) 
      Lmean = result[6] 
      Lmean = Lmean*(nbdays/(nbdays+1)) + dataline[6]/(nbdays) 
      Rmean = result[10] 
      Rmean = Rmean*(nbdays/(nbdays+1)) + dataline[7]/(nbdays) 
      Lstdev,Rstdev = result[7],result[11] 



      add = (dataline[6] - Lmean) 
      Lstdev = sqrt(Lstdev*Lstdev + (add*add)) 
      add = (dataline[7] - Rmean) 
      Rstdev = sqrt(Rstdev*Rstdev + (add*add)) 
      mean = (sum(Leftmean10)/min(10,nbdays)) 
      meansquare = mean*mean 

      othermean = (sum([i*i for i in Leftmean10])/min(10,nbdays)) 
      Lstdev10 = othermean - meansquare 


      mean = (sum([int(i) for i in Rightmean10])/min(10,nbdays)) 
      meansquare = mean*mean 

      othermean = (sum([i*i for i in Rightmean10])/min(10,nbdays)) 
      Rstdev10 = othermean - meansquare 

      nbdays +=1 

      Leftmean10 = json.dumps(result[8]) 
      Rightmean10 = json.dumps(result[12]) 
      print(Leftmean10) 

      cursor2.execute("""UPDATE {} SET Leftmean = ?, 
        Leftstdev = ?, 
        Leftmean10 = ?, 
        Leftstdev10 = ?, 
        Rightmean = ?, 
        Rightstdev = ?, 
        Rightmean10 = ?, 
        Rightstdev10 = ?, 
        nbdays = ? WHERE (timestp = ? AND idq = ? 
        AND idz = ? 
        AND portq = ? 
        AND portz = ? 
        AND prot = ?);""".format(name3), (Lmean,Lstdev,Leftmean10,Lstdev10,Rmean,Rstdev,Rightmean10,Rstdev10,nbdays,result[0],result[1],result[2],result[3],result[4],result[5])) 




    conn.commit() 
    conn2.commit() 
    conn.close() 
    conn2.close() 
    bla= "it works" 

    return(bla)  

を"が作成されたものの空の場合)、条件" if result = None "が常に検証され、データベースが正しく埋められます。特に、私のリストが正常に機能json.dumps(mylist) を使用して、ストックされた二回目の処理中に問題が発生します。

print(result[8]) 
Leftmean10 = json.loads(result[8]) 
print(Leftmean10) 
Rightmean10 = json.loads(result[12]) 
print(type(Leftmean10)) 

戻り

"[69]" 
[69] 
<class 'str'> 

ブロックを、私はさらにこのため'str'タイプの後にエラーが発生します。

私は何が起こっているのか分かりません。 json.loads関数はリストを返しますか?それはそれがそうするものです:print(Leftmean10)は私に[69]を返し、"[69]"を返しません。それはまだプログラムのためのものです^^

ありがとうございます!

+0

これは** JSON文字列**です。正しい出力です。文字 '' ['、' 6 '、...'を含む文字列を書くことができます。 –

+0

申し訳ありませんが、私はあなたのコメントを完全に理解していませんでしたx)!私のために、リストのような['、'、 '2'、 '、'、 '3'、 ']'ではなく、 '[2,3]'を返す 'json.loads(" [2,3] ( "[2,3]")x) –

答えて

0

あなたの文字列result[8]が実際にそれらに二重引用符文字が含まれていますjson.loadsインサイド

>>> print('[69]') 
[69] 
>>> print('"[69]"') 
"[69]" 

をこれは正しく文字列"[69]"に変換されます。これを解決する1つの方法は、次の2つの二重引用符を削除することです。

json.loads(result[8][1:-1]) 
+0

ありがとうございます!それは動作しますが、部分的にしかありません。同じテーマxに別の問題があります! –

関連する問題