我正在編寫一個腳本,它以遞歸方式掃描目錄並將它們存儲在作爲列表集合的字典中。該列表中包含具有文件名和文件大小的列表。該文件名可能包含UTF-8字符,如下所示。Python sqlite3.ProgrammingError:除非使用可解釋8位字節串的text_factory,否則不得使用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的當前版本修復,因爲我在尋找通用的修復,使其甚至可以在更高版本的工作中給出。 另外我觀察到,由於這個錯誤沒有數據被插入到數據庫中。那麼我怎樣才能確保即使某些操作導致的錯誤以前的數據可以插入到數據庫中。
有你爲什麼使用UTF-8,而不是'unicode'什麼特別的原因? – 2014-10-04 13:49:18
沒有理由我可以使用unicode也沒有任何問題。 – Abhinav 2014-10-04 13:57:32
與你的實際問題無關,但'global dirDict'不是很好的風格。如果在調用read_file_directory()之前不需要'dirDict',在'read_file_directory()'中創建它,那麼最好將'dirDict'傳遞給函數,使得它的簽名變成'def read_file_directory(path,dirDict)', '並從該功能返回。 – mhawke 2014-10-04 14:21:56