何老师《自然语言处理入门》关于直接运行zipf_law.py会提示No module named ‘tests.test_utility’?
程序员文章站
2022-05-09 13:29:54
...
[请教:为什么直接运行
会提示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