何老师《自然语言处理入门》关于直接运行zipf_law.py会提示No module named ‘tests.test_utility’?

[请教:为什么直接运行

会提示No module named ‘tests.test_utility’?](https://bbs.hankcs.com/t/topic/79)
看到有人在bbs上问这个问题,而回答问题的很多答主都没有真正解决提问者的问题,主要提到的是添加python包路径,需要注意的是,路径需要设置到tests所在的上一目录,即如下图所示,设置到code目录即可,不然的话,会出现找不到包tests
在这里插入图片描述

其实除此之外,很多人添加了还是发现无法使用tests包,为什么呢?因为还可能存在另一个问题。
在这里插入图片描述
可以查看tests目录下的__init__.py文件,而普通目录和python包最大的不同就在于此,这个文件的作用是:当用 import 导入该目录时,会执行 init.py 里面的代码,而很明显可以看到,这里源代码中是没有写__init__.py的,因此,我们只需要把其完善即可,这样就可以直接调用

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-06-03 19:15

# Author: BugII
# Date: 2021-11-10 20:32
# 直接用何老师的包会报错,原因是因为没有写好tests包的__init__.py,导致即便添加了路径也找不到对应的文件

from .test_custom_dict import *
from .test_hanlp import *
from .test_multithread import *
from .test_utility import *
from .test_word2vec import *

后面经实验发现,其实不加上也可以,因为就在tests的目录下,索引的时候还是可以直接找到(以上方法仅供屡次不成功的参考)

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9c in position 2: illegal multibyte sequence

TypeError: a bytes-like object is required, not ‘str’

此外,这个zipf_law.py还不能直接跑通,主要出现以上两个问题,处理如下代码所示

f = Counter()
with open(msr, 'rb') as src:	# 加'rb', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence 
    for line in src:
        # TypeError: a bytes-like object is required, not 'str'
        # 需要解码
        line = line.decode()    
        line = line.strip()
        for word in line.split('  '):
            # word = word.strip()
            # if len(word) < 2: continue
            f[word] += 1

或者由于提示不能用gbk,那么指定编码方式就行

f = Counter()
with open(msr, encoding="utf-8") as src:	# 加'encoding', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence 
    for line in src:
        line = line.strip()
        for word in line.split('  '):
            # word = word.strip()
            # if len(word) < 2: continue
            f[word] += 1

上述问题简单解决方法

昨天其实采用了比较暴力的方法,对每个open都指定了encoding编码方式,但发现何老师其他还有很多地方都直接用open,所以直接改太费时间了,上网查资料发现,可以传递参数给python解释器采用某种编码方式执行。类似于如下

python -X utf8 xxx.py

VS code 使用pythonArgs指定要传递给Python解释器的参数

在这里插入图片描述

笔者平时用的比较多的是VS code,这里也给出VS code设置方法,需改VS code python的运行调试脚本,即launch.json,查阅官方文档得知,要传指定要传递给Python解释器的参数可以通过pythonArgs,如下所示。

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Python: 当前文件",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            // pythonArgs 指定要传递给Python解释器的参数
            "pythonArgs": [     
                "-X","utf8"
            ]
        }
    ]
}

最后,这本书配置的源代码是没问题的,但有些系统上不一致的地方可能会出现小问题,以上都是我在window10上操作的结果,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值