鱼C论坛

 找回密码
 立即注册
查看: 1781|回复: 14

[已解决]课后作业030最后一个动手题

[复制链接]
发表于 2017-2-23 12:38:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os
def search(target,contents):
    txt_list = []
    os.chdir(contents)
    f = os.walk(os.getcwd())
    for each in f:
        if os.path.splitext(each)[1] == '.txt':
            txt_list.append(each)
    return txt_list


def position(target,file_name):
    line = 0
    rank = []
    position=dict()
    for each in txt_list:
        f = open(each)
        for eachline in f:
            line+=1
            begin = eachline.find(target)
            while begin != -1:
                rank.append(begin+1)
                begin = eachline.find(target,begin+1)
            position[line]=rank
        f.close()
    return position

target = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
print('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO)'%(target),end='')
order = input("")
if order =='YES':
    txt_list = search(target,os.curdir)
    for each in txt_list:
        position = position(target,each)
        if position:
            line = position.keys()
            line = sorted(line)
            for each_line in line:
                print('============================================================')
                print('在文件【%s】中找到关键字【%s】'%(each,target))
                print('关键字出现在第%s行,第%s个位置'%(each_line,str(position[each_line])))
            

运行以后报错
Traceback (most recent call last):
  File "C:\Users\lenovo\Desktop\python\搜索文本中关键字副本.py", line 32, in <module>
    txt_list = search(target,os.curdir)
  File "C:\Users\lenovo\Desktop\python\搜索文本中关键字副本.py", line 7, in search
    if os.path.splitext(each)[1] == '.txt':
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python35-32\lib\ntpath.py", line 224, in splitext
    return genericpath._splitext(p, '\\', '/', '.')
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python35-32\lib\genericpath.py", line 118, in _splitext
    sepIndex = p.rfind(sep)
AttributeError: 'tuple' object has no attribute 'rfind'


求助是怎么回事啊
最佳答案
1970-1-1 08:00:00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-23 19:06:54 | 显示全部楼层
我要回家吃饭了,可能明天才能帮你继续看问题,你先修改这两个问题吧,改为之后,问题已经大幅度减少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-23 19:19:37 | 显示全部楼层
import os
def search(contents):                                                            #搜索contents目录中的所有txt格式文件并将文件名保存在txt_list中
    txt_list = []
    os.chdir(contents)
    f = os.walk(os.getcwd())
    for each in f:
        if os.path.splitext(each)[1] == '.txt':
            txt_list.append(each)
    return txt_list


def position(target,file_name):                                            #搜索file_name文件中含有target目标关键字的位置,返回为坐标的position(字典)
    line = 0
    rank = []
    position=dict()
    f = open(file_name)
    for eachline in f:
        line+=1
        begin = eachline.find(target)
        while begin != -1:
            rank.append(begin+1)
            begin = eachline.find(target,begin+1)
        position[line]=rank
    f.close()
    return position

target = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
print('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO)'%(target),end='')
order = input("")
if order =='YES':
    txt_list = search(target,os.curdir)
    for each in txt_list:
        position = position(target,each)
        if position:
            line = position.keys()
            line = sorted(line)
            for each_line in line:
                print('============================================================')
                print('在文件【%s】中找到关键字【%s】'%(each,target))
                print('关键字出现在第%s行,第%s个位置'%(each_line,str(position[each_line])))
            

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-23 19:20:49 | 显示全部楼层
32269100 发表于 2017-2-23 19:06
我要回家吃饭了,可能明天才能帮你继续看问题,你先修改这两个问题吧,改为之后,问题已经大幅度减少

因为我本来要用递归的所以定义了函数,虽然后来看了答案后把递归改了,不过其他就没改了。

我改了下加了下解释放在楼下了,有时间再帮我看下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-23 19:28:49 | 显示全部楼层
我的理解是这样的:

因为这里我是设定的search(contents)是可以选择所有目录进行查找的,最后引用函数的时候再设定为os.curdir
f是所有的子文件名吧(?)然后对所有文件名(each)进行判断是否为.txt文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-23 19:35:18 | 显示全部楼层
32269100 发表于 2017-2-23 18:30
我做完这一题啦,我没有写自定义函数,因为不好让我看清楚思路,所以,你写得那么长,必须要多备注,否则根 ...

哎呀,忘了点回复

我的理解是这样的:

因为这里我是设定的search(contents)是可以选择所有目录进行查找的,最后引用函数的时候再设定为os.curdir
f是所有的子文件名吧(?)然后对所有文件名(each)进行判断是否为.txt文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 21:27:17 | 显示全部楼层

回帖奖励 +2 鱼币

来看看大神门是怎么解答的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-24 19:22:45 | 显示全部楼层

回帖奖励 +2 鱼币

大佬们,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-25 20:18:12 | 显示全部楼层
32269100 发表于 2017-2-24 09:27
你把我找出的两个问题修改了再看吧,你不修改,也无法检测下面的问题,居然还用上递归了。。。

我觉得你 ...

前两天上班有点忙没看到回复,晚上查了一下发现我对于os.walk的理解有误,然后还有一些小问题,做了一些修改


  1. import os
  2. def search(contents):
  3.     txt_list = []
  4.     os.chdir(contents)
  5.     f = os.walk(os.getcwd())
  6.     for eachfile in f:
  7.         for each in eachfile[2]:
  8.             if os.path.splitext(each)[1] == '.txt':
  9.                 each = os.path.join(eachfile[0],each)
  10.                 txt_list.append(each)
  11.     return txt_list


  12. def position(target,file_name):
  13.     line = 0
  14.     rank = []
  15.     position=dict()
  16.     f = open(file_name,'r',encoding='gbk')
  17.     for eachline in f:
  18.         line+=1
  19.         if target in eachline:
  20.             begin = eachline.find(target)
  21.             while begin != -1:
  22.                 rank.append(begin+1)
  23.                 begin = eachline.find(target,begin+1)
  24.             position[line] = rank
  25.     f.close()
  26.     return position

  27. target = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
  28. print('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO)'%(target),end='')
  29. order = input("")
  30. if order =='YES':
  31.     txt_list = search(os.curdir)
  32.     for each in txt_list:
  33.         pos = position(target,each)
  34.         if pos:
  35.             keys = pos.keys()
  36.             keys = sorted(keys)
  37.             for each_line in keys:
  38.                 print('============================================================')
  39.                 print('在文件【%s】中找到关键字【%s】'%(each,target))
  40.                 print('关键字出现在第%s行,第%s个位置'%(each_line,str(pos[each_line])))
  41.             

复制代码




现在可以输出正确的结果了,但是在输出结果之后又有一个报错

Traceback (most recent call last):
  File "C:\Users\lenovo\Desktop\python\搜索文本中关键字副本.py", line 36, in <module>
    pos = position(target,each)
  File "C:\Users\lenovo\Desktop\python\搜索文本中关键字副本.py", line 19, in position
    for eachline in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence


虽然不影响结果输出,但是百度了半天这个报错的原因,也没解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-26 13:50:04 From FishC Mobile | 显示全部楼层
32269100 发表于 2017-2-26 11:06
图一是你原来的代码输出后的图示;图二是我改良你的代码后输出后的图示

我把你代码倒数第第三、第二行 ...

好棒!!!这个细节我都没注意到,想问下你运行的时候不会有我显示的那个报错的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 15:04:08 | 显示全部楼层
这个帖子厉害了

值得学习啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 17:19:24 | 显示全部楼层

回帖奖励 +2 鱼币

还是来看大佬学习的,另外,只有我一个人很喜欢这个黑色的shell背景么。。怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-26 18:00:08 | 显示全部楼层
32269100 发表于 2017-2-26 15:08
没有你的那种报错,我运行没报错。

那应该是我运行环境的问题,谢谢啦,终于解决一个问题成就感upup!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2017-3-8 07:24:19 | 显示全部楼层

回帖奖励 +2 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-13 09:44:14 | 显示全部楼层
拖到现在也没写完
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表