【发布时间】:2016-10-20 14:18:19
【问题描述】:
我尝试制作一个脚本,在文件夹中搜索双文件并将其返回到这样的字典中 {filehash1:[dirfile1,dirfile2],filehash2:[dirfile3]} (dirfile1 和 dirfile2 相同的文件名称/位置不同)
第一个代码:
import glob
import hashlib
def getallfolders(dir):
print dir+"*\\"
folders = glob.glob(dir+"*\\")
return folders
def getallfiles(dir):
folders = glob.glob(dir+"*.*")
return folders
def filehash(file):
BLOCKSIZE = 65536
hasher = hashlib.sha1()
with open(file, 'rb') as afile:
buf = afile.read(BLOCKSIZE)
while len(buf) > 0:
hasher.update(buf)
buf = afile.read(BLOCKSIZE)
return hasher.hexdigest()
def double_files(dir):
mil = {}
folders = getallfolders(dir)
for folder in folders:
mil.update(double_files(folder))
files = getallfiles(dir)
for file in files:
fhash = filehash(file)
if fhash in mil.keys():
mil[fhash] = mil[fhash] + [file]
else:
mil[fhash] = [file]
return mil
print double_files("E:\\not organised\\")
但是如果我尝试运行它,它会因错误而崩溃
IOError: [Errno 2] No such file or directory: file
这是因为不是所有的文件名都是英文的 所以我尝试修复它,现在代码如下所示:
# -*- coding: utf-8 -*-
import glob
import hashlib
import codecs
def getallfolders(dir):
print dir+"*\\"
folders = glob.glob(dir+"*\\")
return folders
def getallfiles(dir):
folders = glob.glob(dir+"*.*")
return folders
def filehash(file):
BLOCKSIZE = 65536
hasher = hashlib.sha1()
file = file.decode("utf8")
with codecs.open(file, "rb", encoding="utf8") as afile:
buf = afile.read(BLOCKSIZE)
while len(buf) > 0:
buf = buf.encode("ISO-8859-1")
hasher.update(buf)
buf = afile.read(BLOCKSIZE)
return hasher.hexdigest()
def double_files(dir):
mil = {}
folders = getallfolders(dir)
for folder in folders:
mil.update(double_files(folder))
files = getallfiles(dir)
for file in files:
fhash = filehash(file)
if fhash in mil.keys():
mil[fhash] = mil[fhash] + [file]
else:
mil[fhash] = [file]
return mil
print double_files("E:\\not organised\\")
我添加
# -*- coding: utf-8 -*-
并改变
with open(file, 'rb') 到 with open(file, encoding='utf-8')
但现在我得到了错误:
UnicodeDecodeError: 'utf8' codec can't decode byte .. in position ..: Tnvalid start byte
(.. 表示它并不总是相同的)
它发生在buf = afile.read(BLOCKSIZE) 行
我知道文件已打开,但是当我尝试使用读取功能时,它会因该错误而崩溃。
而且我不知道如何解决它...
请帮忙。
【问题讨论】:
-
# -*- coding: utf-8 -*-仅适用于代码中的非 ascii litteral 字符串。 -
文件是什么编码的?你确定是
utf-8吗? -
它不是一个特定的文件它可以是一个txt jpg等
-
@Maze88 如何理解编码的工作原理而不是偶然编程? OP 已经将他的文件名解码为 unicode(你认为
file = file.decode("utf8")在做什么?)