1

これを行うpython(2.7)でコードを書き込もうとしています:

  1. sqlite でデータベースを開く
  2. データベースにクエリを実行し、いくつかの結果を取得します。データベースには複数のテーブルがあり、さまざまなテーブルからのレコードが必要です: データベースは次のようになります:
    • data.db ---> [table1[col1, col2, col3], table2[col1, col2, col3]]
  3. 結果を繰り返す
  4. 結果に対して何かを行います(たとえば、レコードにはデコードが必要な日付があります)
  5. さらにアクセスできるように、すべてのレコードを名前付きタプルに保存します

今からパート1、2、3、4を達成しましたが、結果をnamedtupleに保存する方法がわかりません。すべての反復で、名前付きタプルに必要なデータを一時変数に保存するとします。

for result in results:
var1 = table1.col1
var2 = table2.col1
var3 = table3.col1

(今、変数で何かをしたいのですが、それは問題ではなく、3つの変数をnamedtupleに保存します)

contacts = namedtuple('contacts', 'Z_PK ZFULLNAME ZPHONE ZTEXT ZDATE')

    if has_contacts_sqlite:

        # reading contacts from database
        # 1st step: ZWAPHONE table
        query = "SELECT * FROM ZWAPHONE"
        self.tempcur.execute(query)
        tempcontacts = self.tempcur.fetchall()

        for contact in tempcontacts:
            id = contact.Z_PK
            contact_key = contact.ZCONTACT
            favorite_key = contact.ZFAVORITE
            status_key = contact.ZSTATUS
            phonenum = contact.ZPHONE

            # 2nd step: name from ZWACONTACT table
            query = "SELECT * FROM ZWACONTACT WHERE Z_PK=?;"
            self.tempcur.execute(query, [contact_key])
            contact_entry = self.tempcur.fetchone()
            if contact_entry == None:
                name = "N/A"
            else:
                name = contact_entry.ZFULLNAME

            # 3rd step: status from ZWASTATUS table
            query = "SELECT * FROM ZWASTATUS WHERE Z_PK=?;"
            self.tempcur.execute(query, [status_key])
            status_entry = self.tempcur.fetchone()
            if status_entry == None:
                text = "N/A"
                date = "N/A"
            else:
                text = status_entry.ZTEXT
                date = self.formatDate(status_entry.ZDATE)

            #print ("%s" %(id))
            #print ("%s" %(name.encode(sys.stdout.encoding, errors='replace')))
            #print ("%s" %(phonenum.encode(sys.stdout.encoding, errors='replace')))
            #print ("%s" %(text.encode(sys.stdout.encoding, errors='replace')))
            #print ("%s" %(date))

            contact = contacts(id, name, phonenum, text, date)


print contacts
for line in contacts:
    print line
4

1 に答える 1

2

Anamedtuple()は、ファクトリ関数で生成されたクラスに他なりません。

SomeRowResult = namedtuple('SomeRowResult', 'var1 var2 var3')

SomeRowResultクラス オブジェクト ( のサブクラス) を次に示しtupleます。これを呼び出すと、クラスのインスタンスが作成されます。

for result in results:
    result = SomeRowResult(table1.col1, table2.col1, table3.col1)

これらの結果のリストが必要な場合は、そのリストを明示的に作成する必要があります。

all_results = []
for result in results:
    result = SomeRowResult(table1.col1, table2.col1, table3.col1)
    all_results.append(result)
于 2013-11-20T13:12:18.773 に答える