零基础学习Python第30课练习中的问题
参考第30课的回答,自己写了如下代码,为什么不对,(要在C:\Users\wutin\Documents\Python\Exercises下查找)import os
def print_pos(key_dict):
keys = key_dict.keys()
keys = sort(keys)
for each_key in keys:
print('关键词在第%s行,第%s个位置' % (each_key,str(key_dict)))
def pos_in_line(line,keyword):
pos = []
begin = line.find(keyword)
while begin != -1:
pos.append(begin+1)
begin = line.finde(keyword,begin+1)
return pos
def search_in_file(file,keyword):
f = open(file,encoding='utf-8')
line_num = 0
key_dict = dict()
for each_line in file:
count += 1
if keyword in each_line:
key_dict = pos_in_line(each_line,keyword)
f.close()
return key_dict
def search_files(keyword):
all_files = os.walk(os.getcwd())
txt_files = []
for i in all_files:
for each_file in i:
if os.path.splitext(each_file) == '.txt':
txt_files.append(os.path.join(i,each_file)
for each_txt_file in txt_files:
key_dict = seach_in_file(each_txt_file,keyword)
if key_dict:
print('===========================================')
print('在文件%s中找到关键词%s' % (each_txt_file,keyword))
print_pos(key_dict)
keyword = input('请输入查找的关键词')
os.chdir('C:\Users\wutin\Documents\Python\Exercises')
search_files(keyword)
本帖最后由 Twilight6 于 2020-6-27 23:22 编辑
你的代码错误好多。。。比如不知从哪里变出的count ,sort(keys) ,还有填错的方法名 seach_in_file 少了个字母 r 。。。
帮你改了下错误的地方,代码其他地方没看,至少不会报语法错误了
import os
def print_pos(key_dict):
keys = key_dict.keys()
keys = keys.sort()
for each_key in keys:
print('关键词在第%s行,第%s个位置' % (each_key,str(key_dict)))
def pos_in_line(line,keyword):
pos = []
begin = line.find(keyword)
while begin != -1:
pos.append(begin+1)
begin = line.finde(keyword,begin+1)
return pos
def search_in_file(file,keyword):
f = open(file,encoding='utf-8')
line_num = 0
key_dict = dict()
count = 0
for each_line in file:
count += 1
if keyword in each_line:
key_dict = pos_in_line(each_line,keyword)
f.close()
return key_dict
def search_files(keyword):
all_files = os.walk(os.getcwd())
txt_files = []
for i in all_files:
for each_file in i:
if os.path.splitext(each_file) == '.txt':
txt_files.append(os.path.join(i,each_file))
for each_txt_file in txt_files:
key_dict = search_in_file(each_txt_file,keyword)
if key_dict:
print('===========================================')
print('在文件%s中找到关键词%s' % (each_txt_file,keyword))
print_pos(key_dict)
keyword = input('请输入查找的关键词')
os.chdir('C:\Users\wutin\Documents\Python\Exercises')
search_files(keyword)
谢谢,您的回答。的确有不少错误,自己太粗心了。就是您和我修改的代码都出现如下错误"(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3 truncated \UXXXXXXXX escape ’不知道是什么原因。 发现就是这个语句造成的“os.chdir('c:\Users\wutin\Documents\Python\Exercises')”,不知道是什么原因?谢谢 Tshirt 发表于 2020-6-28 08:41
谢谢,您的回答。的确有不少错误,自己太粗心了。就是您和我修改的代码都出现如下错误"(unicode error) 'un ...
路径里:C:\Users\wutin\Documents\Python\Exercises
\u在python中表示后续是UNICODE编码,所以不能解析路径
你可以改成
os.chdir(r'C:\Users\wutin\Documents\Python\Exercises')
前面+r可以去除转义字符,既后方为纯文本。
应该是这样吧 Twilight6 发表于 2020-6-27 23:19
你的代码错误好多。。。比如不知从哪里变出的count ,sort(keys) ,还有填错的方法名 seach_in_file...
为什么我把楼主的代码复制过去运行的时候所有的空格都会报错,然后我删掉重新空格就好了,你也是这样吗 tiger吴 发表于 2020-6-28 15:58
为什么我把楼主的代码复制过去运行的时候所有的空格都会报错,然后我删掉重新空格就好了,你也是这样吗
不会呀....不会报错 Twilight6 发表于 2020-6-28 16:40
不会呀....不会报错
卧槽,手机用户又被打脸了 {:10_266:} tiger吴 发表于 2020-6-28 17:19
卧槽,手机用户又被打脸了
{:10_266:}其他地方我没看,代码运行可能会报错,但是不会报语法之类的错误了 ~ yhhpf 发表于 2020-6-28 08:55
路径里:C:%users\wutin\Documents\Python\Exercises
%u在python中表示后续是UNICODE编码,所以不能解析 ...
谢谢您的回复,的确按您建议可以运行,但是半道中出现这样的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte,小甲鱼的代码运行也有这个报错,不知道什么原因?谢谢!
Tshirt 发表于 2020-6-29 07:38
谢谢您的回复,的确按您建议可以运行,但是半道中出现这样的错误:UnicodeDecodeError: 'utf-8' codec ca ...
你新用的代码是什么?哪一行报错了? yhhpf 发表于 2020-6-29 09:32
你新用的代码是什么?哪一行报错了?
是这样的:
Traceback (most recent call last):
File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 49, in <module>
search_files(keyword)
File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 41, in search_files
key_dict = search_in_file(each_txt_file,keyword)
File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 22, in search_in_file
for each_line in f:
File "C:\Program Files\Python38\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte Tshirt 发表于 2020-6-29 20:37
是这样的:
Traceback (most recent call last):
文件编码的问题,比如txt文件可以是多个编码方式。
f = open(file,encoding='utf-8')
而你上面这句代码使用'utf-8'编码打开,当文件本身不是通过utf-8编码时,就无法读取了,你可以用notepad++打开重新编码,如果是txt文件直接打开后另存时选择编码方式,再用对应编码类型读取;
例如:假设你文件编码是'gbk',你的代码就需要改成:f = open(file,encoding='gbk')
你也可以用下面的方式,获取文件的编码类型
执行
import chardet
f = open('a.doc',r)
data = f.read()
print chardet.detect(data)
结果
{'confidence': 0.64465744, 'encoding': 'utf-8'}
前面是相似度后面是编码格式
或者 return chardet.detect(data).get("encoding") 直接获取文件编码格式
页:
[1]