

■やりたいこと  
1.Big queryで2つテーブルを作成（tableA,tableBとします）  
2.この2つのテーブルnameを比較して一致率が高い文字列を横並びでCSVで抽出

→ここまではできている

tableA

ID | name  
---|---  
1 | 美容院A  
2 | 美容院B  
3 | 美容院C  
  
tableB

ID | name  
---|---  
1 | 美容院b  
2 |  
3 | 美容院A 渋谷店  
  
■問題点  
上記のようにテーブルBに空白がある場合、下記のようなエラーがでてしまい処理が途中でとまってしまう  
`TypeError: object of type 'NoneType' has no len()`

■試したこと  
以下が全体のコードになります。  
`if len(result) <=
0:`以下の部分でtry,exceptで空白の場合は無視するようにしたつもりなのですがそれでも同じエラーがでてしまいます。

このような場合はどうやって例外処理を無視してスクリプトが動くようにすればよいでしょうか。

[code]

    from google.cloud import bigquery
    import db_dtypes
    import pandas as pd
    from difflib import get_close_matches, SequenceMatcher
    import csv
    
    client = bigquery.Client()
    
    string01 = """
    SELECT name from `tableA`
    """
    ## Make an API request(?)
    string_01 = client.query(string01)
    
    ## Dataframeに格納
    df_string01 = client.query(string01).to_dataframe()
    ## listに変換
    list_string01 = df_string01['name'].to_list()
    print(list_string01)
    
    
    string02 = """
    SELECT name from `tableB`
    """
    # Make an API request(?)
    stirng_02 = client.query(string02)
    
    ## Dataframeに格納
    df_string02 = client.query(string02).to_dataframe()
    ## listに変換
    list_string02 = df_string02['name'].to_list()
    print(list_string02)
    
    
    ## リストのname列を比較して類似度を出す
    # https://ja.stackoverflow.com/questions/90287/python-difflib%e3%81%a72%e3%81%a4%e3%81%ae%e3%83%aa%e3%82%b9%e3%83%88%e5%86%85%e3%81%ab%e3%81%82%e3%82%8b%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%af%94%e8%bc%83%e3%81%97-%e9%a1%9e%e4%bc%bc%e5%ba%a6%e3%81%8c%e6%9c%80%e3%82%82%e9%ab%98%e3%81%84%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%a8%aa%e4%b8%a6%e3%81%b3%e3%81%a7csv%e3%81%a7%e5%87%ba%e3%81%97%e3%81%9f%e3%81%84/90294#90294
    
    ## リスト b から一番類似している文字列を抽出し→類似度を取得しリストとして返す関数を定義
    
    def closest(x):
        result = get_close_matches(x,list_string02,n=1,cutoff=0.5)
        ### resultが0の場合(似ている文字列がない場合)返り値を「0.0」として返す処理
        if len(result) <= 0:
            try:
                return[x, None, 0.0]
            except:
                pass  
        result = result[0] 
        s = SequenceMatcher(None, x, result) #xとresultの一致率を抽出
        return [x, result, s.ratio()] #返り値を表示(一致率)
    
    ## list_string01のデータ全てを順番に処理するリスト内包表記
    data = [closest(s) for s in list_string01]
    
    ## csvファイルとして出力
    ## open_csv.py
    with open('close.csv', 'w', newline='', encoding='UTF-8') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow(['string01','string02','類似度'])
        csvwriter.writerows(data)
    
    
    
[/code]


CC BY-SA 4.0
2022-08-27T03:30:29.590
90782
2022-08-27T03:30:54.547
2022-08-27T03:30:54.547
52109
52109
question
python python3
セルが空白のときに起きるエラーの回避方法(TypeError: object of type 'NoneType' has no len())