作者alvinlin (艾尔文)
看板Python
标题Re: [问题] 读取下一个资料夹路径
时间Sun Aug 4 16:32:08 2019
其实帮人实做不是一个好做法,除非对方己经束手无策。不过我感觉你很不用心,同样的问题回了又问,还说别人的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列出所有子资料夹的路径
: : 然後当作参数进行读取
: : 但是读取却只会读取列出来的最後一条
: : 我要如何让他读取下一个路径
: : 有相关的教学吗
: : 网路上只有找到列出路径
: : 找不到将这些列出的路径拿来用的方法
: : 求详细...
-----
Sent from JPTT on my iPhone
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.186.172 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1564907530.A.44E.html
※ 编辑: alvinlin (123.192.186.172 台湾), 08/04/2019 16:40:26
※ 编辑: alvinlin (123.192.186.172 台湾), 08/04/2019 16:44:45
1F:推 HenryLiKing: 推 好人难当 08/04 16:51
2F:推 s4028600: 抱歉因为我的理解力确实很差 不过也的确学了一些东西 08/04 20:04
3F:→ s4028600: 至少终於搞懂os.walk的一些用法 虽然还是很多概念完全 08/04 20:04
4F:→ s4028600: 搞不懂... 08/04 20:04
5F:推 s4028600: 现在没电脑晚点在试 08/04 20:13
6F:推 s4028600: 很多没看过的代码...不知道有没有那种看程式跑的过程来 08/04 20:18
7F:→ s4028600: 学习...像这个不知道是怎麽图像化的... 08/04 20:18
9F:→ s4028600: 6faQNTgw1f5wnm06h3ug30ci08cake.gif 08/04 20:20
10F:推 s4028600: rootDirLists是多个资料夹?如果是同目录下的多个子目 08/04 20:27
11F:→ s4028600: 录我想我终於找到方法了... 08/04 20:27
12F:推 s4028600: 经过测试後有几个问题 08/04 21:38
13F:推 s4028600: 你这个搜寻档案的能力比我用walk转到txt再读取使用还好 08/04 21:40
14F:→ s4028600: 我整个白写了... 08/04 21:40
15F:→ s4028600: count...没人建议我用这个 第一次看到 不知道怎麽问... 08/04 21:41
16F:推 s4028600: 对了 你的图片没问题 但是你的代码有几行被切断了 可能 08/04 21:44
17F:→ s4028600: 是排版失误吧 08/04 21:44
18F:推 s4028600: 有些档案被误判为错误或没找到... 08/04 21:56
19F:推 s4028600: 关於那个for in ...好吧目前看不懂 不过有个参考可以分 08/04 22:01
20F:→ s4028600: 析了 08/04 22:01
21F:推 s4028600: lower是大写转小写 这个是用在什麽情况? 删掉好像不会 08/04 22:24
22F:→ s4028600: 影响程式? 08/04 22:24
23F:→ alvinlin: 档案名称有可能是大写。全部先改成小写 08/05 01:45
24F:→ alvinlin: 我建议你先学习怎麽分析你的问题然後做出流程图 08/05 01:46
25F:→ alvinlin: 以图为准吧。文字只是帮你少打些字。 08/05 01:49
26F:→ alvinlin: 程式没有很完整的测试。只是分享供你参考。我现在看到就 08/05 01:51
27F:→ alvinlin: 有一、两个缺点,留给你想想 08/05 01:51
28F:→ alvinlin: 写程式过程比结果重要 08/05 01:55
29F:推 ouryouth: 推好人 08/05 13:15