

画像のエラーはいったいどうすれば解決できるのでしょうか？  
調べた結果属性に問題があるようですがよくわからなかったため質問しました。

ソースコードは以下に記載します。

よろしくお願いします。

[code]

    import sys, getopt
    import sqlite3
    
    class Location:
    
        def __init__(self, filename=""):
            self.filename = filename
            self.locations = list()
    
        def seek(self):
            if self.filename=="":
                return False
    
            file = open(self.filename,"r")
    
            for line in file:
                line_sep=line.split("\t")
                if( len(line_sep) > 2 ):
                    if(line_sep[1] == "LOC"):
                       time     = line_sep[2].split(',')[0]
                       latitude = line_sep[2].split(',')[1]
                       longitude= line_sep[2].split(',')[2]
    
                       location = {'time':time, 'latitude':latitude, 'longitude':longitude}
                       self.locations.append(location)
            return True
    
        def printAll(self):
            if(len(self.locations) > 0):
                print 'time, latitude, longitude'
            for location in self.locations:
                print location['time'], location['latitude'], location['longitude']  
    
    class Audio:
    
        def __init__(self, filename=""):
            self.filename = filename
            self.startTime = 0.0
            self.stopTime = 0.0
    
        def seek(self):
            if self.filename=="":
                return False
    
            file = open(self.filename,"r")
    
            for line in file:
                line_sep=line.split()
                if( len(line_sep) > 2 ):
                    if(line_sep[1] == "AUDIO"):
                        if(line_sep[2] == "start"):
                            self.startTime = line_sep[0]
                        elif(line_sep[2] == "stop"):
                            self.stopTime = line_sep[0]
    
            return True
    
        def printTime(self):
            print self.startTime, self.stopTime
    
        def getDuration(self):
            return (float(self.stopTime) - float(self.startTime))
    
    
    class FileManager:
        def __init__(self, filename, database):
            #database connection
            self.conn = sqlite3.connect(database)
            self.cur = self.conn.cursor()
            self.filename = filename
    
            # filename must be separated by '-'. (e.g. hasc-20120527-115511-raw.log)
            self.idname = '-'.join(filename.split("-")[0:3])
    
        def _getFileinfoId(self):
            self.cur.execute("select fileinfo.id from files inner join fileinfo on files.id=fileinfo.fileId where files.filename like '" + self.idname + "%'")
            return self.cur.fetchone()[0]
    
        def updateDatabase(self):
            fileinfoId = str(self._getFileinfoId())
            audio = Audio(self.filename)
            audio.seek()
    
            self.cur.execute("update fileinfo set startTime='"+ audio.startTime + "' where id=" + fileinfoId )
            self.cur.execute("update fileinfo set endTime='"  + audio.stopTime  + "' where id=" + fileinfoId )
            self.conn.commit()
    
            loc = Location(filename = self.filename)
            loc.seek()
            for location in loc.locations:
                self.cur.execute("insert into geolocations(fileId, time, latitude, longitude) values("+ fileinfoId +", "+ location['time'] +", "+ location['latitude'] +", "+ location['longitude']+")")
                self.conn.commit()
    
    def main(argv):
        logfile = ''
        database = ''
        try:
            opts, args = getopt.getopt(argv,"hl:d:",["log=","db="])
            if len(opts) < 1:
                raise getopt.GetoptError("")
        except getopt.GetoptError:
            print 'hascseeker.py --log <logfile> --db <databasefile>'
            sys.exit()
        for opt, arg in opts:
            if opt in ("-h", "--help"):
                print 'hascseeker.py --log <logfile> --db <databasefile>'
                sys.exit()
            elif opt in ("-l", "--log"):
                logfile = arg
            elif opt in ("-d", "--db"):
                database = arg
    
        man = FileManager(logfile, database)
        man.updateDatabase()
    
    if __name__ == "__main__":
       main(sys.argv[1:])
    
[/code]

![エラー画面](https://i.stack.imgur.com/TsVX9.jpg)


CC BY-SA 3.0
2015-01-15T12:12:23.813
4616
2015-01-15T14:43:19.890
2015-01-15T12:31:36.427
4978
7411
question
python sqlite
Python における `'NoneType' object has no attribute '__getitem__'` というエラーについて


SQL 文の実行結果が 0 件の場合、`fetchone()` は `None` を返します。

[11.13. sqlite3 — DB-API 2.0 interface for SQLite
databases](https://docs.python.org/2.7/library/sqlite3.html#sqlite3.Cursor.fetchone)

> Cursor.fetchone()
>
> Fetches the next row of a query result set, returning a single sequence, or
> None when no more data is available.

なので、以下の様に書くべきではないでしょうか。

[code]

    def _getFileinfoId(self):
      self.cur.execute("select fileinfo.id from files inner join fileinfo on files.id=fileinfo.fileId where files.filename like '" + self.idname + "%'")
      result = self.cur.fetchone()
      return ( None if result is None else result[0] )
    
[/code]

ただ、`None` の場合にはそのまま返していますので、適宜変更して下さい。


CC BY-SA 3.0
2015-01-15T13:24:10.723
4625
2015-01-15T13:24:10.723
4616
answer


修正方法は [**heliac2001さんの回答**](https://ja.stackoverflow.com/a/4625/728)
を見ていただくとして、エラーの意味するところがわからないようですのでエラーメッセージの意味を少し。

> `'NoneType' object has no attribute '__getitem__'`

attributeは属性と訳せますが、このエラーの意味として平たく言えばメソッドとかプロパティの事です。

「(`__getitem__`を呼び出すような処理だが) `__getitem__`
というメソッドとかプロパティの類を持っていませんよ」という意味になります。

最初の `'NoneType' object` は None型のオブジェクトです。変数の中身が（文字とか数値とかでなく、Noneだった）ということです。

まとめる（というほどでもないですが）と、  
「問題となった行では、None型なオブジェクトに対して `__getitem__` を使おうとしているけど、そのオブジェクトは `__getitem__`
というものを持っていない」

というエラーで、ちょうど以下の様なコードで発生するエラーですね。

[code]

    sample = None
    sample.__getitem__(0)
    
[/code]

さて、コード中には存在しない`__getitem__`
はどこから来たのかという疑問が生まれますが、これはpythonが内部で呼び出す特殊なメソッド（magic method)です。

`varname[0]` というようにコンテナ変数にアクセスすると、内部では
pythonが`__getitem__`メソッドを暗黙に呼び出します。（magic
methodはpythonが内部で呼び出すものなので通常ユーザーが勝手に呼び出してよいものではありません。）

[code]

    Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = ['x','y']
    >>> a[0]
    'x'
    >>> a.__getitem__(0)             <- getitemでも同じように取得できる。
    'x'
    
    >>> b = { 'a': 'A', 'b': 'B' }
    >>> b['a']
    'A'
    >>> b.__getitem__('a')           <- getitemでも同じように取得できる。
    'A'
    >>> b.__getitem__('b')
    'B'
    
[/code]

`__xxxx__` なスタイルの記述がエラーに現れたら名前からやろうとしていることを想像してみるといいかもしれません。

`self.cur.fetchone()[0]`で、`fetchone()` が `None`を返すので `None[0]`
となり、None型から0番目のアイテムを取り出そうとしてエラーとなっているわけです。

と、説明してみましたがあまりわかりやすくなってないかもしれませんね(^^;


CC BY-SA 3.0
2015-01-15T14:43:19.890
4639
2015-01-15T14:43:19.890
2017-04-13T12:52:39.113
-1
728
4616
answer