繁体   English   中英

Python TypeError: (“'NoneType' 类型的对象没有 len()”

[英]Python TypeError: (“object of type 'NoneType' has no len()”

使用 Pyinstaller 运行从 python 程序转换的可执行文件时遇到错误。 直接从 python 程序运行时没有错误。 感谢任何指导!

python代码片段:

def post_processing(df):
    column_names = df.columns.tolist()
    def update_nric_checksum(x):
        w_list = [0,2,7,6,5,4,3,2]
        alp_dict = {1: 'A', 2:'B', 3:'C', 4:'D', 5:'E', 6:'F', 7:'G', 8:'H', 9:'I', 10:'Z', 11:'J'}
        key_alp = []
        key_alp_list = []
        total = 0
        
        if (len(x)<=7) or (len(x)>9):
            return x

        if len(x)==9:
            for idx, item in enumerate(x[:-1]):
                if item in string.digits:
                    total += (int(item) * w_list[idx])
            remainder = total%11
            key_alp = 11 - remainder
            updated_x = x[:8] + alp_dict[key_alp]
            return updated_x
    
    df = df.fillna("").astype(str)
    
    df[['NRIC_first','NRIC_second']]=df['NRIC'].str.split(",", expand=True) 
    df['NRIC_first']=df['NRIC_first'].str.replace("[","").str.replace("]","").str.replace("'","").str.replace(" ","")
    df['NRIC_second']=df['NRIC_second'].str.replace("[","").str.replace("]","").str.replace("'","").str.replace(" ","")
    df[['NRIC_first_','NRIC_second_']] = df[['NRIC_first','NRIC_second']].applymap(update_nric_checksum) 
    df.loc[(df.NRIC_first_==df.NRIC_second_), 'NRIC_'] = "['" + df['NRIC_first_'].map(str) + "']"
    df.loc[(df.NRIC_first_!=df.NRIC_second_), 'NRIC_'] = "['" + df['NRIC_first_'].map(str) + "', '" + df['NRIC_second_'].map(str) + "']"
    df.drop(['NRIC', 'NRIC_first','NRIC_second','NRIC_first_','NRIC_second_'], axis=1, inplace = True)
    df = df.rename(columns={'NRIC_': 'NRIC'})
return df[column_names]

运行 exe 的错误片段:

Traceback (most recent call last):
  File "MyCodes.py", line 319, in <module>
  File "utils\util.py", line 124, in post_processing
    df[['NRIC_first_','NRIC_second_']] = df[['NRIC_first','NRIC_second']].applymap(update_nric_checksum)
  File "site-packages\pandas\core\frame.py", line 6553, in applymap
  File "site-packages\pandas\core\frame.py", line 6487, in apply
  File "site-packages\pandas\core\apply.py", line 151, in get_result
  File "site-packages\pandas\core\apply.py", line 257, in apply_standard
  File "site-packages\pandas\core\apply.py", line 286, in apply_series_generator
  File "site-packages\pandas\core\frame.py", line 6551, in infer
  File "pandas/_libs/lib.pyx", line 2217, in pandas._libs.lib.map_infer
  File "utils\util.py", line 79, in update_nric_checksum
    if (len(x)<=7) or (len(x)>9):
TypeError: ("object of type 'NoneType' has no len()", 'occurred at index NRIC_second')
[12272] Failed to execute script MyCodes

对于输出,“NRIC_first”下将有所有案例的条目,但“NRIC_second”可能为空。 这是输入的样子:

NRIC
['SXXXXXXXB', 'SXXXXXXXI']
['SXXXXXXXH']
['SXXXXXXXB', 'SXXXXXXXC']
['SXXXXXXXH']

对于您正在处理的某些内容,x 必须为 None。 添加类似的东西

if math.isnan(x):
    return "0"

错误就会消失。 从根本上说,您的数据集似乎需要清理。

该错误不是由于 NRIC_second 列中的空字符串("" 是空字符串)造成的,因为空字符串的长度为 0。该列中可能有一些 None 值。 需要清理数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM