当前位置:   article > 正文

python → 数据应用_鈥檆'+str(i)+'xlsx

鈥檆'+str(i)+'xlsx

python函数及代码复用

函数中的return

质数-return导出-语句按照顺序执行-for-else

  1. "函数return安照语句顺序"
  2. def fIsPrime(N):
  3. if N<2:return False
  4. if N==2:return True
  5. if N>2:
  6. for i in range(2,N):
  7. if N%i==0:return False
  8. else:return True#虽然执行后面的语句,return按照顺序优先导出
  9. def fIsPrime(N):
  10. if N<2:return False
  11. if N==2:return True
  12. if N>2:
  13. for i in range(2,N):
  14. if N%i==0:return False
  15. return True#return按照顺序优先导出.所以这一句中的else是前面都没有导出True的时候再导出。位置在哪儿都行。
  16. def fTest():
  17. return False
  18. for i in range(1,10):
  19. if i%2==0:
  20. return True
  21. if fTest()==False:print("虽然执行后面的语句,return按照顺序优先导出")

python 函数包的简单应用

输出一门语言的字母 chr( ) ord( )

函数包

留下英语字符

  1. #以英语为例
  2. for x in range(ord("A"),ord("Z")+1):
  3. print(chr(x))

留下汉语字符

过滤掉非汉语字符

  1. def isChinese(ch):
  2.     if 19968<=ord(ch)<40869:return True;
  3.     return False
  4. #unicode汉字编码范围,19968-40869,即十六进制范围4E00-9FA5

正序和反序 sort reverse

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Jul 3 15:12:36 2019
  4. @author: cc
  5. """
  6. print("输入整数,大小排序,中间用空格分开")
  7. nums=input("请输入数据:")
  8. numLine=[int(n) for n in nums.split()]
  9. numLine.sort()
  10. print(numLine)

反序,用reverse

  1. a=int(input("请输入一个正整数:"))
  2. b=list(str(a))
  3. b.reverse() #原来,直接用b.reverse()就可以把顺序弄反过来。b的名称不变,但是内容却发生了变化。后面环环相扣。
  4. if int(b[0])==0: #注意==是两个。由于写了一个=号,程序没有运行出来,花费了大量时间找问题。经验教训。
  5. del b[0]
  6. list2="".join(b)
  7. print(list2)
  8. else:
  9. list2="".join(b)
  10. print(list2)

 #注意:==是两个。由于写了一个=号,程序没有运行出来,花费了大量时间找问题。

排列参考文献

生活中的实际情况:写完论文后,文本中有很多条参考文献,用pyhon写代码,按照每一条参考文献的第一个汉字的字母顺序,排列参考文献。

询问“文心一言”,请人工智能写一下代码。人工智能给出的参考如下:

分析:要按照每条参考文献的第一个汉字的字母顺序排列参考文献,我们可以按照以下步骤进行:

  1. 读取参考文献列表。
  2. 提取每条参考文献的第一个汉字。
  3. 将这些汉字转换为拼音。
  4. 根据拼音对参考文献进行排序。
  5. 输出排序后的参考文献列表。

以下是一个简单的Python代码示例,使用pypinyin库将汉字转换为拼音,然后根据拼音排序:

  1. from pypinyin import lazy_pinyin
  2. # 假设参考文献是一个列表,其中每个元素都是一个字符串,代表一条参考文献
  3. references = [
  4. "文献1",
  5. "文献2",
  6. "参考3",
  7. "文4",
  8. "献5",
  9. "文6",
  10. ]
  11. # 使用pypinyin将每个参考文献的第一个汉字转换为拼音,并添加到新的列表中
  12. pinyin_references = [lazy_pinyin(ref)[0] for ref in references]
  13. # 根据拼音对参考文献进行排序
  14. sorted_references = sorted(zip(pinyin_references, references), key=lambda x: x[0])
  15. # 输出排序后的参考文献列表
  16. for pinyin, ref in sorted_references:
  17. print(ref)

注意:这个代码示例使用了lazy_pinyin函数,它只会转换每个汉字的第一个字母为拼音,而不是整个汉字。如果你希望获取整个汉字的拼音,可以使用pypinyin库的pinyin函数代替。

在电脑上实际操作,如下:

  1. myfile=open("wenxian.txt","r",encoding="utf-8")
  2. data=myfile.read()
  3. myfile.close()
  4. ref_lines=data.splitlines()
  5. ref_lines=[s for s in ref_lines if s]#列表中的元素可能是空字符串(空行),你可以使用列表推导式删除这些空字符串
  6. from pypinyin import lazy_pinyin
  7. # 使用pypinyin,遍历每个参考文献ref,将其第一个汉字lazy_pinyin(ref)[0] 转换为拼音,并添加到新的列表pinYin_ref中
  8. pinYin_ref=[lazy_pinyin(ref)[0] for ref in ref_lines]
  9. sorted_references = sorted(zip(pinYin_ref, ref_lines), key=lambda x: x[0])
  10. for pinyin,ref in sorted_references:
  11. print(ref)

实际上,对这段代码可以继续优化。让它按照文献的不同类型来进行排列。

即可完成。

遍历文件夹中的文件os

  1. os.chdir("E:\eng")
  2. subList=os.listdir(os.getcwd())#总的eng文件夹。
  3. print(subList)
  4. os.getcwd()
  5. #作用:获取当前的工作路径;
  6. os.getcwd()
  7. os.listdir(path)
  8. #作用:传入任意一个path路径,返回的是该路径下所有文件和目录组成的列表;
  9. os.walk(path)
  10. #含义 :传入任意一个path路径,深层次遍历指定路径下的所有子文件夹,返回的是一个由路径、文件夹列表、文件列表组成的元组。
  11. os.path.exists(path)
  12. #含义:传入一个path路径,判断指定路径下的目录是否存在。存在返回True,否则返回False;
  13. os.mkdir(path)
  14. #含义:传入一个path路径,创建单层(单个)文件夹;
  15. #注意:如果文件夹已经存在,就会报错。因此创建文件夹之前,需要使用os.path.exists(path)函数判断文件夹是否存在;

在运行os 得时候,在E盘新建了文件夹,命名为"test"。test文件夹里的程序,命名为"mytest.py"。

运行的时候,出现如下问题:“OSError: [WinError 123] 文件名、目录名或卷标语法不正确”。

推测,文件见命名为test,在程序运行的时候会因为同名而产生冲突。所以, 重新命名文件夹为“scoretest”。

然后运行程序:

  1. import os
  2. os.chdir("E:\scoretest")
  3. subList=os.listdir(os.getcwd())#总的eng文件夹
  4. print(subList)

这时候,就会呈现出该文件夹中的子项。

数据处理numpy

  1. '''
  2. 如果想知道函数包的用法。上cmd,
  3. import <函数包>
  4. 或者 from <函数包> import <某函数>
  5. help(函数包)
  6. dir(函数包)
  7. '''
  8. def Hanshu():
  9. #一维数组
  10. import numpy as np
  11. myrange=range(10)
  12. print(myrange)
  13. #print(type(inylist))
  14. newlist=list(myrange)
  15. mylist3=np.array(newlist)
  16. #print(mylist3)
  17. for i in mylist3:
  18. print(i)
  19. #print(type(newlist))
  20. myrange2=np.arange(10)
  21. def ZhenXian():
  22. #制作正弦曲线y=x^3
  23. import matplotlib.pyplot as plt
  24. import numpy as np
  25. x=np.linspace(-5,5,250)
  26. y=np.sin(x**3)
  27. plt.plot(x,y,'r--')
  28. plt.show()
  29. #ZhenXian()
  30. def Zhengtai():
  31. #用于绘图的模块
  32. import matplotlib.pyplot as plt
  33. import numpy as np
  34. import random
  35. #设置随机种子
  36. a=np.random.seed(1234)
  37. #随机产生的样本量
  38. N=10000
  39. #生成正态随机数
  40. randnorm=np.random.normal(size=N)
  41. #print(randnorm)
  42. bins=np.sqrt(N)
  43. #正态分布密度函数
  44. sigma=1;mu=0
  45. a=1/(np.sqrt(2*sigma*np.pi))
  46. b=np.exp(-((bins-mu)**2)/2)
  47. norm_dist=a*b
  48. print(norm_dist)
  49. x=np.sqrt(N)
  50. y=norm_dist
  51. plt.plot(x,y,'r--')
  52. plt.show()
  53. #最后这个正态图没有做出来
  54. #《python 可视化数据分析》李迎,第102页
  55. #Zhengtai()
  56. import matplotlib.pyplot as plt
  57. import numpy as np
  58. import random
  59. #等差数列。
  60. mylist=np.arange(2,50,3)
  61. #随机数列
  62. newlist=np.linspace(1,10,50)
  63. print(mylist)
  64. print(newlist)

数据可视panda

  1. '''
  2. https://blog.csdn.net/qq_43003358/article/details/103809293
  3. 电影评分数据的统计分析及可视化
  4. 1. 数据准备(获取、读取)
  5. 从网上获取的电影评分数据集。包含6040个用户对3900部电影做出的1000209条评分。数据集包含3个文件,各文件说明如下:
  6. (1)"ratings.dat":UserID,MovieID,Rating,Timestamp
  7. - UserI:用户ID(1-6040)
  8. - MovieID:电影ID(1-3952)
  9. - Rating:评分(1-5) are made on a 5-star scale (whole-star ratings only)
  10. - Timestamp:时间戳(时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。)
  11. 每个用户至少有 20 个评分
  12. (2)"users.dat":UserID,Gender,Age,Occupation,Zip-code
  13. - Gender:性别"M"(男),"F"(女)
  14. - Age:年龄,根据如下范围标注为对应数字
  15. * 1: "Under 18"
  16. * 18: "18-24"
  17. * 25: "25-34"
  18. * 35: "35-44"
  19. * 45: "45-49"
  20. * 50: "50-55"
  21. * 56: "56+"
  22. -Occupation:职业,根据如下列表标注为对应数字
  23. * 0: "other" or not specified
  24. * 1: "academic/educator"
  25. * 2: "artist"
  26. * 3: "clerical/admin"
  27. * 4: "college/grad student"
  28. * 5: "customer service"
  29. * 6: "doctor/health care"
  30. * 7: "executive/managerial"
  31. * 8: "farmer"
  32. * 9: "homemaker"
  33. * 10: "K-12 student"
  34. * 11: "lawyer"
  35. * 12: "programmer"
  36. * 13: "retired"
  37. * 14: "sales/marketing"
  38. * 15: "scientist"
  39. * 16: "self-employed"
  40. * 17: "technician/engineer"
  41. * 18: "tradesman/craftsman"
  42. * 19: "unemployed"
  43. * 20: "writer"
  44. - Zip-code:邮编
  45. (3)"movies.dat" :MovieID,Title,Genres
  46. -Title:电影名
  47. - Genres :题材(包含于下面的列表中)
  48. * Action
  49. * Adventure
  50. * Animation
  51. * Children's
  52. * Comedy
  53. * Crime
  54. * Documentary
  55. * Drama
  56. * Fantasy
  57. * Film-Noir
  58. * Horror
  59. * Musical
  60. * Mystery
  61. * Romance
  62. * Sci-Fi
  63. * Thriller
  64. * War
  65. * Western
  66. '''
  67. import pandas as pd
  68. import numpy as np
  69. import matplotlib.pyplot as plt
  70. %matplotlib inline
  71. #读取users数据集
  72. unames = ['user_id', 'gender', 'age', 'occupation', 'zip']
  73. users = pd.read_table('users.dat', sep='::', header=None, names=unames, engine='python')
  74. #读取ratings数据集
  75. rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
  76. ratings = pd.read_table('ratings.dat', sep='::', header=None, names=rnames, engine='python')
  77. #读取movies数据集
  78. mnames = ['movie_id', 'title', 'genres']
  79. movies = pd.read_table('movies.dat', sep='::', header=None, names=mnames, engine='python')

python函数包的综合应用

处理excel文件 openpyxl

整理并提取文件名称

统计各个高中的高考录取数据。各个数据表格的名称不一致。列表栏目也不一致。

整理数据文件,从xls文件中提取各个高中的名称,如下代码:

  1. import os
  2. import openpyxl
  3. os.chdir("E:\scoretest")
  4. subList=os.listdir(os.getcwd())
  5. for isen in subList:
  6. #先从文件中取中学的名字。
  7. name=isen.split("中")
  8. aSen=name[0]
  9. bSen=aSen+"中"
  10. if bSen[-3:]=="高级中":
  11. school=bSen+"学"
  12. elif bSen[-3:]=="高中学":
  13. school=bSen[:-1]
  14. elif bSen[-3]=="第":
  15. school=bSen+"学"
  16. else:
  17. school=bSen
  18. print(school)

获取各个文件中第一行标题栏

openpyxl处理文件需要注意,它针对的是xlsx,而不是xls。如果是xls,仅仅表面上改变一下名称为xlsx是不行的,openpyxl依然无法处理。可以选择用函数包xlrd等,或者是通过Excel或者WPS将xls文件另存为xlsx文件,这样就能够打开了。

  1. import os
  2. import openpyxl
  3. os.chdir("E:\scoretest")
  4. subList=os.listdir(os.getcwd())
  5. for myxlsxName in subList:
  6. print(myxlsxName)
  7. wb=openpyxl.load_workbook(filename=myxlsxName)
  8. mysheet=wb[wb.sheetnames[0]] #读取xlsx文件中的第一张表。
  9. column_count = mysheet.max_column #获取竖列column的数量。
  10. row_count=mysheet.max_row+1#获取横行column的数量。因为循环的时候是“左闭右开”,所以会加上1。
  11. headList=[]
  12. for col in range(1,column_count+1):
  13. cell_value = mysheet.cell(row=1, column=col).value
  14. headList.append(cell_value)
  15. print(headList)

即可完成。

打开相关文件

使用openpyxl安装包,读取xlsx文件。下面是一个案例

  1. import openpyxl
  2. file1=openpyxl.load_workbook("Marvel.xlsx")#打开工作表
  3. sheet=file1["new title"]
  4. sheetname=file1.sheetnames# 获取“Marvel.xlsx”工作薄中名为“new title”的工作表
  5. print(sheetname)# sheetnames是用来获取工作薄所有工作表的名字的,如果不知道工作薄到底有几个工作表,就可以把工作表的名字都打
  6. A1cell=sheet['A1']
  7. A1value=A1cell.value# 把“new title”工作表中A1单元格赋值给A1_cell,再利用单元格value属性,就能打印出A1单元格的值
  8. print(A1value)

下面是另外一个案例.

  1. import openpyxl
  2. wb2=openpyxl.load_workbook(filename="积累文档-QQ音乐链接简练版.xlsx")
  3. sheetRanges=wb2[wb2.sheetnames[0]]#定位到表格第一张表
  4. myList=[]
  5. for row in sheetRanges.rows:#遍历每一横行
  6. iList=[]
  7. iList.append(row[0].value)#输出xlsx文件每一单元格中的值
  8. iList.append(row[1].value)
  9. myList.append(iList)
  10. newLine=[]
  11. for everyLine in myList:
  12. if len(everyLine[0])>=20:
  13. newStr=everyLine[0].replace(everyLine[0],"关于腾讯 ")
  14. newLine.append([newStr,everyLine[1]])#依据字符串长度判断,将delStr中的语句替换,使得文本更加简明清晰
  15. else:
  16. newLine.append(everyLine)
  17. for i in newLine:
  18. print(i)

即可完成。

又如下面例子。

  1. import os
  2. from random import choice,randrange
  3. from random import *
  4. from openpyxl import Workbook,load_workbook
  5. import sqlite3
  6. def GRD():
  7. for i in range(10):
  8. xlsName="xlsxs"+str(i)+".xlsx"
  9. totalLines=randrange(100)
  10. wb=Workbook()
  11. ws=wb.worksheets[0]
  12. ws.append(["a","b","c","d","e"])
  13. for j in range(totalLines):
  14. line=[chr(randint(50,70)) for x in range(5) ]
  15. ws.append(line)
  16. wb.save(xlsName)
  17. GRD()
  18. print(os.getcwd())
  19. os.chdir("E:\社团")
  20. print(os.listdir(os.getcwd()))
  21. xlsxs=("xlsxs"+ fn for fn in os.listdir("."))
  22. with sqlite3.connect("dataxlsx.db") as conn:
  23. cur=conn.cursor()
  24. for xlsx in xlsxs:
  25. sql="INSERT INFO fromxlsx VALUE(?,?,?,?,?)"
  26. cur.executemany(sql,eachXlsx(xlsx))
  27. conn.commit()

即可完成。

统计各个xlsx表中的成绩

完整代码如下:

  1. import os
  2. import openpyxl
  3. wblast=openpyxl.Workbook()
  4. wslast=wblast.active
  5. rowHead=["姓名","性别","民族","就读学校","文理/理科","高考成绩","录取院校","录取专业"]
  6. wslast.append(rowHead)
  7. os.chdir("E:\scoretest")
  8. subList=os.listdir(os.getcwd())
  9. n=2 #在总的汇集表格中列出其名,n=1的时候是标题栏。n>=2是正文。
  10. for myxlsxName in subList:
  11. #先从文件中取中学的名字。
  12. name=myxlsxName.split("中")
  13. aSen=name[0]
  14. bSen=aSen+"中"
  15. if bSen[-3:]=="高级中":
  16. school=bSen+"学"
  17. elif bSen[-3:]=="高中学":
  18. school=bSen[:-1]
  19. elif bSen[-3]=="第":
  20. school=bSen+"学"
  21. else:
  22. school=bSen
  23. print(school)
  24. wb=openpyxl.load_workbook(filename=myxlsxName)
  25. mysheet=wb[wb.sheetnames[0]] #读取xlsx文件中的第一张表。
  26. column_count = mysheet.max_column #获取竖列column的数量。
  27. row_count=mysheet.max_row+1#获取横行column的数量。因为循环的时候是“左闭右开”,所以会加上1。
  28. headList=[]
  29. for col in range(1,column_count+1):
  30. cell_value = mysheet.cell(row=1, column=col).value
  31. headList.append(cell_value)
  32. nameCol=headList.index("姓名")+1
  33. if "录取院校" in headList:
  34. universityIndex=headList.index("录取院校")#用于将不规则的字头题目转化为统一的文本形式
  35. headList[universityIndex]="录取学校"
  36. elif "录取大学" in headList:
  37. universityIndex=headList.index("录取大学")
  38. headList[universityIndex]="录取学校"
  39. else:pass
  40. universityCol=headList.index("录取学校")+1
  41. if "文科/理科" in headList:
  42. wenliIndex=headList.index("文科/理科")
  43. headList[wenliIndex]=("文理科")
  44. elif "科类" in headList:
  45. wenliIndex=headList.index("科类")
  46. headList[wenliIndex]="文理科"
  47. else:pass
  48. if "文理科" in headList:
  49. wenlikeCol=headList.index("文理科")+1
  50. else:wenlikeCol=10
  51. if "高考分数" in headList:
  52. fenshuIndex=headList.index("高考分数")
  53. headList[fenshuIndex]="高考成绩"
  54. else:pass
  55. if "高考成绩" in headList: fenshuCol=headList.index("高考成绩")+1
  56. else:fenshuCol=10
  57. if "民族" in headList:minzuCol=headList.index("民族")+1
  58. else:minzuCol=10
  59. if "性别" in headList:xingbieCol=headList.index("性别")+1
  60. else:xingbieCol=10
  61. if "专业" in headList:majorCol=headList.index("专业")+1
  62. else:majorCol=10
  63. for row in range(2,mysheet.max_row+1):
  64. name_cell_value=mysheet.cell(row=row,column=nameCol).value
  65. university_cell_value=mysheet.cell(row=row,column=universityCol).value
  66. wenlike_cell_value=mysheet.cell(row=row,column=wenlikeCol).value
  67. fenshu_cell_value=mysheet.cell(row=row,column=fenshuCol).value
  68. minzu_cell_value=mysheet.cell(row=row,column=minzuCol).value
  69. xingbie_cell_value=mysheet.cell(row=row,column=xingbieCol).value
  70. fenshu_cell_value=mysheet.cell(row=row,column=fenshuCol).value
  71. major_cell_value=mysheet.cell(row=row,column=majorCol).value
  72. wslast.cell(n,1,name_cell_value)
  73. wslast.cell(n,2,xingbie_cell_value)
  74. wslast.cell(n,3,minzu_cell_value)
  75. wslast.cell(n,4,school)
  76. wslast.cell(n,5,wenlike_cell_value)
  77. wslast.cell(n,6,fenshu_cell_value)
  78. wslast.cell(n,7,university_cell_value)
  79. wslast.cell(n,8,major_cell_value)
  80. n+=1
  81. wblast.save("E:\scoreCa.xlsx")

比较两个表格的异同

在处理完毕高考成绩后,现在需要比较两张表格的异同。则用如下代码:

  1. import os
  2. import openpyxl
  3. from openpyxl import Workbook
  4. wblost=Workbook()
  5. wslost=wblost.active
  6. wb2=openpyxl.load_workbook(filename="scoreCa.xlsx")#这张表上的人名有些遗失
  7. mysheet2=wb2[wb2.sheetnames[0]] #读取xlsx文件中的第一张表。
  8. column_count2 = mysheet2.max_column #获取竖列column的数量。
  9. row_count2=mysheet2.max_row+1#获取横行column的数量。因为循环的时候是“左闭右开”,所以会加上1。
  10. nameList2=[]
  11. for row in range(1,row_count2+1):
  12. cell_value = mysheet2.cell(row=row, column=1).value
  13. name2=cell_value
  14. nameList2.append(name2)
  15. wb1=openpyxl.load_workbook(filename="allinfo.xlsx")#这张表中的人名比较全。
  16. mysheet=wb1[wb1.sheetnames[0]] #读取xlsx文件中的第一张表。
  17. column_count = mysheet.max_column #获取竖列column的数量。
  18. row_count=mysheet.max_row+1#获取横行column的数量。因为循环的时候是“左闭右开”,所以会加上1。
  19. n=1#是指的工作表中第一个横行
  20. for row in range(1,row_count+1):
  21. cell_value = mysheet.cell(row=row, column=1).value
  22. name=cell_value
  23. iList=[]
  24. if name not in nameList2:
  25. for column in range(1,column_count+1):
  26. ivalue=mysheet.cell(row=row,column=column).value
  27. iList.append(ivalue)
  28. for i,item in enumerate(iList):#将列表中的字符串,输入到工作表中的每一行中。
  29. wslost.cell(n,i+1,item)
  30. n+=1
  31. wblost.save("lost.xlsx")

即可完成。

读取图片并转化数据 cv2

cv2.imread

以下这段代码可以识别英文命名的图片,而不能识别中文命名的图片。如何解决呢?

  1. import pandas as pd
  2. import cv2
  3. import pytesseract
  4. import os
  5. os.chdir("E:\scoretest")
  6. subList=os.listdir(os.getcwd())
  7. for scoreName in subList:
  8. # 读取PNG图片
  9. image = cv2.imread(scoreName)
  10. # 使用Tesseract OCR库识别图片中的文字
  11. text = pytesseract.image_to_string(image, lang='chi_sim')
  12. # 将识别的文字转换为DataFrame
  13. rows = text.split('\n')
  14. data = []
  15. for row in rows:
  16. if row.strip() == '':
  17. continue
  18. data.append(row.split('\t'))
  19. df = pd.DataFrame(data)
  20. # 将DataFrame保存为Excel
  21. df.to_excel(f'{scoreName}.xlsx', index=False)

cv2.imread("scoreName")方法读取图像,发现imread无法读取中文文件和中文目录,只能识别英文文件和英文目录。

为了解决中文文件目录的问题,可以尝试如下操作:

  1. #要让cv2识别中文命名的文件,可以使用Python的os模块来对文件路径进行编码转换。下面是一段示例代码:
  2. import cv2
  3. import os
  4. def imread_cn(file_path):
  5. # 获取文件的目录和文件名
  6. directory, filename = os.path.split(file_path)
  7. # 将目录进行编码转换
  8. directory = directory.encode('utf-8')
  9. # 将目录和文件名拼接为完整的路径
  10. file_path = os.path.join(directory, filename)
  11. # 使用cv2.imread()方法读取图像
  12. image = cv2.imread(file_path)
  13. return image
  14. # 示例用法
  15. image_path = '中文文件名.jpg'
  16. image = imread_cn(image_path)

在上述代码中,我们首先使用os.path.split()方法获取文件的目录和文件名。然后,将目录进行编码转换,使用encode('utf-8')方法将目录转换为字节字符串。最后,将目录和文件名拼接为完整的路径,并使用cv2.imread()方法读取图像。
将image_path变量替换为中文命名文件的路径,然后运行代码即可。

但是,这样尝试后,发现改动的只是文件夹的名称,对于用中文命名的图片,无济于事。

cv2.imdecode()

进一步思考原因:cv2.imread读到带中文路径图片,会报错。解决方法:先用np.fromfile()读取为np.uint8格式,再使用cv2.imdecode()解码。代码如下:

  1. import pandas as pd
  2. import cv2
  3. import pytesseract
  4. import os
  5. import numpy as np
  6. os.chdir("E:\scoretest")
  7. subList=os.listdir(os.getcwd())#总的eng文件夹
  8. for scoreName in subList:
  9. image = cv2.imdecode(np.fromfile(scoreName, dtype=np.uint8), cv2.IMREAD_COLOR)
  10. # imdecode读取的是rgb,如果后续需要opencv处理的话,需要转换成bgr,转换后图片颜色会变化
  11. image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
  12. # 使用Tesseract OCR库识别图片中的文字
  13. text = pytesseract.image_to_string(image, lang='chi_sim')
  14. # 将识别的文字转换为DataFrame
  15. rows = text.split('\n')
  16. data = []
  17. for row in rows:
  18. if row.strip() == '':
  19. continue
  20. data.append(row.split('\t'))
  21. df = pd.DataFrame(data)
  22. # 将DataFrame保存为Excel
  23. df.to_excel(f'{scoreName}.xlsx', index=False)

"E:\scoretest"文件中是jpg和png格式的图片,由上面程序,通过Console平台,可以将图片数据转化为excel数据。

运行代码后,发现大多数图片能够得到处理,但是有几幅图片,红底白字,可能无法识别。所以,需要进一步优化代码。

笔者思考:推测可能是因为字体和图片颜色的问题。cv2读取彩色图片通道顺序为B、G、R,PIL显示图片是R、G、B顺序,因此读出来图片颜色会改变,需要对图像通道进行调序。

询问BingChat,ChatGPT思考后给出几个可能原因:

要进一步优化代码以解决红底白字图片无法识别的问题,可以尝试以下方法:

  1. 调整图像预处理步骤:在将图像从RGB转换为BGR之前,尝试对图像进行一些预处理操作,例如二值化、灰度化、调整亮度和对比度等。这样可以尝试改变图像的颜色和对比度,以提高文字识别的准确性。

  2. 调整Tesseract OCR的参数:可以尝试调整OCR的参数,例如语言设置、扫描方向、字符集等。可以查阅Tesseract OCR的文档以了解更多可用的参数选项,并根据具体情况进行调整。

  3. 使用其他OCR库:除了Tesseract OCR,还有其他OCR库可供选择,例如百度OCR、阿里云OCR等。可以尝试使用其他OCR库来进行文字识别,并比较识别结果的准确性。

  4. 手动处理无法识别的图片:对于无法通过自动识别的图片,可以手动进行处理。例如,使用图像处理软件对图片进行调整、增强或修改,以提高文字的可读性。然后再使用代码进行文字识别。

优化代码的具体方法和步骤可能因具体情况而异,可以根据实际情况和需求进行尝试和调整。

        基于ChatGpt的建议,选择寻找其它图像处理软件。下面是一个很好的网站平台:

诚华OCR - 图片转文字 - 免费在线OCR (109876543210.com)

        诚华 OCR  图片 →文件,https://zhcn.109876543210.com/。这个网站平台可以说是上面笔者博客所写代码的“完全加强版”。两者的原理应该一致。当然,软件平台生成后,就可以商业化运营。这是软件市场的常规现象。

        登录平台后, 将图片数据转化为表格xlsx数据。

然后,对于自己所编写代码、网站平台都未能清晰识别的图片,则选择用飞书、微信、QQ等的“识别”功能,按照每一列来截取识别。这些APP识别的准确率通常比较高。通常即为截图快捷键。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号