pretty22 发表于 2021-1-3 18:12:34

写了一个小时 改的跟小甲鱼老师的代码差不多 但是就是运行会出错

import os
x = input("请将该脚本放于查找的文件夹内,请输入关键字:")
y = input("请问是否需要打印关键字(%s)在文件夹中具体位置(yes/no):" % x)

#def main1(line , x):
    #list1 = []
    #for t in line.find:
      #list1.append(t + 1)

    #return list1
def main1(line , x):
    list1 = []
    begin = line.find(x)
    while begin != -1:
      list1.append(begin + 1)
      begin = line.find(x , begin+1)

    return list1


def main2(file , x):
    f = open(file ) #f = open(r"file")
    p = dict() #g = dict()
    count = 0
    for h in f:
      count +=1
      if x in h:
            pos = main1(h , x)
            p = pos #g = pos

      f.close()
      return p #return g


def main3(p):
    x = p.keys()
    x = sorted(x)

    for temp in x:
      print("关键字出现在%s,第%s个位置;" % (temp , str(p)))



def main(x , y):
    all_file = os.walk(os.getcwd())
    m = all_file
    a = []

    for i in m:
      for ea in i:
            if os.path.splitext(ea) == '.txt': #if os.path.splitext(ea) == '.text'
                k = os.path.join(i,ea)
                a.append(k)

    for z in a:
      p = main2(z , x) #p = main3(z , x)
      if p: #if p:
            print("================")
            print("在文件(%s)中找到关键字(%s)" % (z , x))

            if y in ('yes','Yes','YES'):
                print(p) # print(p)
   

main(x , y)


请求各位大佬斧正, {:10_266:}

bonst 发表于 2021-1-3 18:25:29

出现什么错误啊

pretty22 发表于 2021-1-3 18:34:05

bonst 发表于 2021-1-3 18:25
出现什么错误啊

这个


Traceback (most recent call last):
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 65, in <module>
    main(x , y)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 56, in main
    p = main2(z , x) #p = main3(z , x)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 25, in main2
    for h in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 45: illegal multibyte sequence

昨非 发表于 2021-1-3 18:42:26

pretty22 发表于 2021-1-3 18:34
这个




所有的文件打开形式换个编码
f = open(file,encoding='utf-8')

wuqramy 发表于 2021-1-3 18:50:16

txt文件打开的编码错误
这一句
f = open(file)
改成
f = open(file,encoding='utf-8')
完整代码
import os
x = input("请将该脚本放于查找的文件夹内,请输入关键字:")
y = input("请问是否需要打印关键字(%s)在文件夹中具体位置(yes/no):" % x)

#def main1(line , x):
    #list1 = []
    #for t in line.find:
      #list1.append(t + 1)

    #return list1
def main1(line , x):
    list1 = []
    begin = line.find(x)
    while begin != -1:
      list1.append(begin + 1)
      begin = line.find(x , begin+1)

    return list1


def main2(file , x):
    f = open(file,encoding='utf-8')
    p = dict() #g = dict()
    count = 0
    for h in f:
      count +=1
      if x in h:
            pos = main1(h , x)
            p = pos #g = pos

      f.close()
      return p #return g


def main3(p):
    x = p.keys()
    x = sorted(x)

    for temp in x:
      print("关键字出现在%s,第%s个位置;" % (temp , str(p)))



def main(x , y):
    all_file = os.walk(os.getcwd())
    m = all_file
    a = []

    for i in m:
      for ea in i:
            if os.path.splitext(ea) == '.txt': #if os.path.splitext(ea) == '.text'
                k = os.path.join(i,ea)
                a.append(k)

    for z in a:
      p = main2(z , x) #p = main3(z , x)
      if p: #if p:
            print("================")
            print("在文件(%s)中找到关键字(%s)" % (z , x))

            if y in ('yes','Yes','YES'):
                print(p) # print(p)


main(x , y)

pretty22 发表于 2021-1-3 18:56:29

wuqramy 发表于 2021-1-3 18:50
txt文件打开的编码错误
这一句



加上去之后就成为这样了

Traceback (most recent call last):
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 64, in <module>
    main(x , y)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 55, in main
    p = main2(z , x) #p = main3(z , x)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 25, in main2
    for h in f:
File "C:\Program Files\Python39\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte

pretty22 发表于 2021-1-3 18:57:00

昨非 发表于 2021-1-3 18:42
所有的文件打开形式换个编码

加上就成为这样了


Traceback (most recent call last):
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 64, in <module>
    main(x , y)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 55, in main
    p = main2(z , x) #p = main3(z , x)
File "C:/Users/pp980/Desktop/从文件中找关键字.py", line 25, in main2
    for h in f:
File "C:\Program Files\Python39\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte

jackz007 发表于 2021-1-3 19:07:12

本帖最后由 jackz007 于 2021-1-3 19:30 编辑

import os

def main(x , y):
    for root , dirs , files in os . walk(os . getcwd()):
      for file in files:
            ext = os . path . splitext(file) . lower()                  # 提取文件扩展名并一律转为小写字母
            if ext in ('.py' , '.c' , '.cpp' , '.h' , '.txt'):             # 根据扩展名筛选符合条件的目标文件
                fn = os . path . join(root , file)                         # 合成目标文件的全路径
                f = open(fn)
                c , r , d = 0 , 0 , []                                     # c ,r 为行号、列号计数
                try:                                                       # 防止程序因读取文件出现错误而终止运行
                  for txt in f:                                          # 风险语句,如果文件编码存在问题,执行此句会出错
                        r = txt . find(x , 0)                              # 查找关键字,执行到此句,说明当前文件平安度过风险   
                        while r != - 1:                                    # 循环查找可能出现在同一行的多个关键字
                            d . append((c + 1 , r + 1))
                            r = txt . find(x , r + 1)
                        c += 1                                             # 当前行数加 1
                except Exception as e:                                     # 如果读取文件出现错误会到这里继续
                  print('*** 错误 :文件 ["%s"] ' % fn)                  # 报告出现错误的文件名称及其路径
                  print('\t' , e)                                        # 报告系统给出的错误类型及原因细节
                f . close()                                                # 无论是否出现错误,都会从这里汇合继续执行
                if d:
                  print('文件 ["%s"] 中找到关键字 ["%s"]' % (fn , x))
                  if y == 'yes':
                        for x in d:
                            print('\t第 %3d 行,%3d 列' % (x , x))

x = input("请将该脚本放于查找的文件夹内,请输入关键字:")
y = input("请问是否需要打印关键字(%s)在文件夹中具体位置(yes/no):" % x)
main(x , y)

Twilight6 发表于 2021-1-3 21:01:36


两个编码都报错了,可能原因是因为你所查找的文件夹内有多种编码的 txt 文本文件

解决方法可以去重新新建个文件夹,然后将代码移动到这个文件夹内

将需要测试的 txt 文本全部另存为,保存时候左下角有保存的编码,选择 ANSI 编码,即可

pretty22 发表于 2021-1-3 21:37:01

Twilight6 发表于 2021-1-3 21:01
两个编码都报错了,可能原因是因为你所查找的文件夹内有多种编码的 txt 文本文件

解决方法可以去重新 ...

对 我之前把这个txt文件跟写好的py文件放到了桌面 才出现了这种情况
然后我将这几个文件放到了新建文件夹中
在新建的文件夹中运行这个py文件 就没有这些 错误了


谢谢大佬的解答
{:10_254:}

pretty22 发表于 2021-1-3 21:39:26

jackz007 发表于 2021-1-3 19:07


哇 这个我还没学到这些内容{:10_266:}看不懂
但还是谢谢大佬了 等我保存学到这些知识点后再来拜读{:10_256:}
页: [1]
查看完整版本: 写了一个小时 改的跟小甲鱼老师的代码差不多 但是就是运行会出错