Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何计数字符而不是字节?_Python 2.7_Character Encoding_Pyodbc_Vertica_Base32 - Fatal编程技术网

Python 2.7 如何计数字符而不是字节?

Python 2.7 如何计数字符而不是字节?,python-2.7,character-encoding,pyodbc,vertica,base32,Python 2.7,Character Encoding,Pyodbc,Vertica,Base32,我有一些UUID作为base32编码的字符串存储在数据库中,没有填充。长度为26个字符。我试图在Python2.7.5中提取它们,并将它们转换为二进制数据,用于不同的数据存储。我的Python DB实用程序将这些base32字符串解释为unicode,每个字符有2个字节,这就产生了问题。代码如下: str = row.uuid print type(str) print "Padding {0} with length {1}, mod 8 is {2}".format(s, len(s), l

我有一些UUID作为base32编码的字符串存储在数据库中,没有填充。长度为26个字符。我试图在Python2.7.5中提取它们,并将它们转换为二进制数据,用于不同的数据存储。我的Python DB实用程序将这些base32字符串解释为unicode,每个字符有2个字节,这就产生了问题。代码如下:

str = row.uuid
print type(str)
print "Padding {0} with length {1}, mod 8 is {2}".format(s, len(s), len(s) % 8)
str = str.ljust(int(math.ceil(len(str) / 8.0) * 8), '=')
print str
uuidbytes = base64.b32decode(str)
row.couponUuid = uuid.UUID(bytes=uuidbytes)
输出如下:

<type 'unicode'>
Padding ANEMTUTPUZFZFH6ANXNW5IOI4U with length 52, mod 8 is 4
ANEMTUTPUZFZFH6ANXNW5IOI4U====
File "path/to/my/script.py", line 143
    uuidbytes = base64.b32decode(str)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/base64.py", line 222, in b32decode
    raise TypeError('Non-base32 digit found')
TypeError: Non-base32 digit found
尝试@Ignacio提供的更简单的编码技巧也无法解决问题

str = row.couponUuid.encode('latin-1', 'replace')
print "Padding {0} with length {1}, mod 8 is {2}".format(s, len(s), len(s) % 8)
str = str.ljust(int(math.ceil(len(str) / 8.0) * 8), '=')
使用
'replace'
'ingore'
,它仍会打印:
填充长度为52的ANEMTUTPUZFZFH6ANXNW5IOI4U,模块8为4

@dano要求的其他信息:

print repr(row.uuid)
显示字符串的unicode编码:

u'A\x00N\x00E\x00M\x00T\x00U\x00T\x00P\x00U\x00Z\x00F\x00Z\x00F\x00H\x006\x00A\x00N\x00X\x00N\x00W\x005\x00I\x00O\x00I\x004\x00U\x00'
从中提取的数据库是(我认为是在7.x系列中)。我不确定它的字符集是什么,但列类型是
VARCHAR(26)
。正在通过连接将其从数据库中拉出。在我的代码中,我并没有专门对数据进行编码或解码。Vertica数据库由不同的代码库填充,我只需要用Python将其拉出即可

以下是Vertica可以告诉我的关于表格列的所有信息:

TABLE_CAT         reporting
TABLE_SCHEM       reporting_master
TABLE_NAME        rmn_coupon
COLUMN_NAME       uuid
DATA_TYPE         12
TYPE_NAME         Varchar
COLUMN_SIZE       26
BUFFER_LENGTH     26
DECIMAL_DIGITS    (null)
NUM_PREC_RADIX    (null)
NULLABLE          1
REMARKS           (null)
COLUMN_DEF  
SQL_DATA_TYPE     12
SQL_DATETIME_SUB  (null)
CHAR_OCTET_LENGTH 26
ORDINAL_POSITION  2
IS_NULLABLE       YES
SCOPE_CATALOG     (null)
SCOPE_SCHEMA      (null)
SCOPE_TABLE       (null)
SOURCE_DATA_TYPE  (null)

因此,采用替换备用空字节的明显方法似乎可以达到目的。(叹气)

显示此输出:

u'A\x00N\x00E\x00M\x00T\x00U\x00T\x00P\x00U\x00Z\x00F\x00Z\x00F\x00H\x006\x00A\x00N\x00X\x00N\x00W\x005\x00I\x00O\x00I\x004\x00U\x00'
u'ANEMTUTPUZFZFH6ANXNW5IOI4U'
u'ANEMTUTPUZFZFH6ANXNW5IOI4U======'
其中最后一行是正确填充的base32字符串

在google上弹出一个搜索“
\x00
python”的窗口,给了我提示

正如Ignacio在上面的评论中指出的,这也可以通过使用正确的编码和解码来解决。我不知道你怎么知道正确的编码和编码是什么,但Ignacio的UTF-16LE做到了这一点

str = str.encode('latin-1').decode('utf-16le')

打印报告(row.uuid)
显示什么?您知道数据库用于存储uuid的编码是什么吗?如何将
uuid
从数据库中拉出?你在什么地方显式地解码了它吗?那是UTF-16LE,解码错误,即字节而不是实际的UTF-16LE。@IgnacioVazquez Abrams听起来是对的。有关于如何正确解码的提示吗?(或转换它?)由于框架的原因,我不确定我是否有权访问连接工厂以传入特定的编码。将其编码为拉丁语1(
.encode('Latin-1')
)将撤消字节解码,以便您可以正确解码。@IgnacioVazquez Abrams no dice。在中间看编辑。
u'A\x00N\x00E\x00M\x00T\x00U\x00T\x00P\x00U\x00Z\x00F\x00Z\x00F\x00H\x006\x00A\x00N\x00X\x00N\x00W\x005\x00I\x00O\x00I\x004\x00U\x00'
u'ANEMTUTPUZFZFH6ANXNW5IOI4U'
u'ANEMTUTPUZFZFH6ANXNW5IOI4U======'
str = str.encode('latin-1').decode('utf-16le')