Re: [问题] 读取下一个资料夹路径

楼主: alvinlin (林矜业)   2019-08-04 16:32:08
其实帮人实做不是一个好做法,除非对方己经束手无策。不过我感觉你很不用心,同样的问题回了又问,还说别人的code没解决你的问题。这是当然的啊。每个人需求不同,至少他解决了他的问题还分享给你。
我也是初学者,只是刚开始这个问题我是用HEX Editor 去研究了档案的 binary code,对照档案本身的解码表一个个去解码。透过这个过程也学到了很多不同的方法和函式。如果对我有帮助的,我就当练习自己实做了一次。
以下综整这些日子以来所有的技巧。除了jpg和png外的图档不检查视为正常。格式与副档名不符的直接修改。提供有类似问题的朋友参考。
import os
import shutil
from PIL import Image
import imghdr
def is_img_valid(imgFile):
isValid = True
try:
Image.open(imgFile).verify()
except:
isValid = False
return isValid
def is_valid_jpg_or_png(imgFile):
if currentFile.endswith('jpeg') or currentFile.endswith('jpg'):
try:
with open(imgFile, 'rb') as f:
f.seek(-2, 2)
return f.read() == b'\xff\xd9'
except OSError:
return False
elif currentFile.endswith('png'):
try:
with open(imgFile, 'rb') as f:
f.seek(-3, 2)
return f.read() == b'\x60\x82\x00' or f.read() [1:] == b'\x60\x82'
except OSError:
return False
else:
return True
rootDirLists = ['Z://folder1', 'C://folder2', 'D://folder3']
count=0
corruptList =[]
formatIncorrect = []
for rootDir in rootDirLists:
print('============寻找目录 {} 中的图档 ============: '.format(rootDir))
for root, dirs, files in os.walk(rootDir):
for file in files:
count += 1
currentFile = os.path.join(root, file).lower()
imgFormat = imghdr.what(currentFile)
if imgFormat != None:
print("检查第{}个档案中...档名为:[{}], 档头格式为 [{}], ".format(count, currentFile, imgFormat), end="")
if not is_img_valid(currentFile):
corruptList.append(currentFile)
result = "看来是坏了"
else:
fileExt = currentFile.split('.')[-1]
if fileExt[0:2] not in imgFormat:
formatIncorrect.append(currentFile)
correctedFile = currentFile.replace(currentFile.split('.
print("副档名与档头格式不符, 直接更改档案名称为: [{}], "
os.rename(currentFile, correctedFile)
currentFile = correctedFile
if is_valid_jpg_or_png(currentFile):
result = "看起来没问题"
else:
corruptList.append(currentFile)
result = "看来是坏了"
print(" 检查结果 [{}]".format(result))
print("============结果 [目录={}] == [检查档案数={}] ============ ".format(rootD
if corruptList:
print('列出坏掉的档案:')
for i in range(0, len(corruptList)):
print(corruptList[i])
else:
print('没有坏掉的档案.')
——-
请看图以免格式跑掉了
https://i.imgur.com/dmPruPn.jpg
https://i.imgur.com/Ri7f793.jpg
※ 引述《alvinlin (艾尔文)》之铭言:
: hi, 我想说应该不会再有问题了.
: 不知你有试了我寄给你的那个连结的范例了吗? [后删]
: ※ 引述《s4028600 (佑)》之铭言:
: : 简单来说
: : 我已经用os.walk列出所有子资料夹的路径
: : 然后当作参数进行读取
: : 但是读取却只会读取列出来的最后一条
: : 我要如何让他读取下一个路径
: : 有相关的教学吗
: : 网络上只有找到列出路径
: : 找不到将这些列出的路径拿来用的方法
: : 求详细...
作者: HenryLiKing (HenryLiKing)   2019-08-04 16:51:00
推 好人难当
作者: s4028600 (佑)   2019-08-04 20:04:00
抱歉因为我的理解力确实很差 不过也的确学了一些东西至少终于搞懂os.walk的一些用法 虽然还是很多概念完全搞不懂...现在没电脑晚点在试很多没看过的代码...不知道有没有那种看程式跑的过程来学习...像这个不知道是怎么图像化的...https://www.runoob.com/wp-content/uploads/2014/05/006faQNTgw1f5wnm06h3ug30ci08cake.gifrootDirLists是多个资料夹?如果是同目录下的多个子目录我想我终于找到方法了...经过测试后有几个问题你这个搜寻档案的能力比我用walk转到txt再读取使用还好我整个白写了...count...没人建议我用这个 第一次看到 不知道怎么问...对了 你的图片没问题 但是你的代码有几行被切断了 可能是排版失误吧有些档案被误判为错误或没找到...关于那个for in ...好吧目前看不懂 不过有个参考可以分析了lower是大写转小写 这个是用在什么情况? 删掉好像不会影响程式?
楼主: alvinlin (林矜业)   2019-08-05 01:45:00
档案名称有可能是大写。全部先改成小写我建议你先学习怎么分析你的问题然后做出流程图以图为准吧。文字只是帮你少打些字。程式没有很完整的测试。只是分享供你参考。我现在看到就有一、两个缺点,留给你想想写程式过程比结果重要
作者: ouryouth (ouryouth)   2019-08-05 13:15:00
推好人

Links booklink

Contact Us: admin [ a t ] ucptt.com