gpt4 book ai didi

Python sqlite3.ProgrammingError : You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings 错误

转载 作者:太空狗 更新时间:2023-10-30 02:19:59 25 4
gpt4 key购买 nike

我正在编写一个脚本,它递归地扫描一个目录并将它们存储在一个字典中,该字典是一个列表的集合。该列表中包含具有文件名和文件大小的列表。此文件名可能包含 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,以便它甚至可以在更高版本上工作。我还观察到,由于这个错误,没有任何数据被插入到数据库中。那么如何确保即使某些操作导致错误,也可以将之前的数据插入到数据库中。

最佳答案

sqlite 异常建议您切换到 unicode 字符串,因此您应该这样做。

Python 的目录列表函数,例如 os.walk 有一个 curious property ;他们将在给定普通字符串时返回普通字符串,并在给定 unicode 字符串时返回 unicode 字符串。因此,当在您的代码中使用 os.walk(path) 时,您应该确保 path 是一个 unicode 字符串。

为此,您可以使用 unicode() 函数显式转换为 unicode,例如在调用 之前编写 path = unicode(path) >os.walk.

此外,您需要在代码中调用 cursor.commit() 才能实际写入数据库。在循环遍历所有文件名后调用一次就足够了。

关于Python sqlite3.ProgrammingError : You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com