我正在编写一个脚本,它可以递归地扫描目录并将其存储在字典中,该字典是列表的集合。这些列表包含文件名和文件大小的列表。如下所示,这个文件名可能包含UTF-8字符。
['test.rus (\xd0\xa5\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb8).srt', 23930]
test.rus (Хельши).srt
现在,当我尝试将该数据插入数据库时,出现以下错误。
Traceback (most recent call last):
File "filedup.py", line 267, in <module>
read_file_directory(directory)
File "filedup.py", line 118, in read_file_directory
(values[i][0], each, values[i][1]))
sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
这个操作的函数如下所示:
from collections import defaultdict
dirDict = defaultdict(list)
def read_file_directory(path):
global dirDict
logger.debug("Path being scanned %s" %path)
fileStats = []
for root, subFolders, files in os.walk(path):
for file_name in files:
fileStats = []
fileStats.insert(0, file_name)
fileSize = os.path.getsize(os.path.join(root,file_name))
fileStats.insert(1, fileSize)
dirDict[root].append(fileStats)
#Insert the data in DB
cursor = dbHandler.cursor()
keys = dirDict.keys()
for each in keys:
values = dirDict[each]
print values
for i in xrange(len(values)):
print values[i]
print values[i][0]
print values[i][1]
fileName = values[i][0]
fileSize = values[i][1]
cursor.execute("insert or ignore into master \
(FileName, FilePath, FileSize) values(?,?,?)", \
(values[i][0], each, values[i][1]))
logger.debug("Insert data for %s, %s, %s" %(values[i][0], each, values[i][1]))
我现在正在学习Python,但是我不知道如何解决这个问题。下面是我正在使用的Python版本。
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
有什么想法可以修复当前版本的Python,因为我正在寻找通用解决方案,以便即使在更高版本上也可以工作。 此外,我观察到由于此错误,没有任何数据插入到数据库中。那么如何确保即使某些操作导致错误,之前的数据也可以插入到数据库中。
unicode
有什么特别的原因吗? - Ignacio Vazquez-Abramsglobal dirDict
不是好的编程风格。最好将dirDict
作为参数传递到函数中,这样它的签名就变成了def read_file_directory(path, dirDict)
,或者如果在调用read_file_directory()
之前不需要dirDict
,则可以在read_file_directory()
中创建它并从该函数返回。 - mhawkeread_file_directory()
中创建dirDict
并返回它。调用该函数的代码将是这样的:dirDict = read_file_directory('path/path/path')
。 - mhawke