代码之家  ›  专栏  ›  技术社区  ›  rtaft

Python中按字节长度拆分字符串

  •  1
  • rtaft  · 技术社区  · 6 年前

    我尝试了几种方法来解决这个问题,然后选择了一种方法,从4000个字符开始,如果字节长度超过4000,请删除一个字符,然后再次检查字节长度。它行得通,但我想知道是否有更好的解决办法。该函数还将列名从“column”更改为“column1”、“column2”…等。

     text = data[key]
     index = 1
     while text:
         length = 4000
         while len(text[0:length].encode('utf-8')) > 4000:
              length -= 1
         data['{}{}'.format(key, index)] = text[0:length]
         text = text[length:]
         index += 1
     del data[key]
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Christopher Jones    6 年前

    检查您针对CLOB的建议是最新的还是基于有关使用定位器访问LOB的旧信息。

    对于cx\u Oracle中的“小”clob,最佳实践是将它们表示为字符串:您的代码将非常简单,而且仍然有效。参见示例 https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py

    另一个解决方案是使用支持32kvarchar2的oracledb的最新版本。

        2
  •  0
  •   rtaft    6 年前

    最后我合并了 G. Andersons link 用我的密码。它的效率更高,因为它不会对每个长度检查进行编码。

        encoded_text = data[key].encode('utf-8')
        index = 1
        while encoded_text:
            length = min(4000, len(encoded_text))
            if len(encoded_text) > 4000:
                while (encoded_text[length] & 0xc0) == 0x80:
                    length -= 1
            data['{}{}'.format(key, index)] = encoded_text[:length].decode('utf-8')
            encoded_text = encoded_text[length:]
            index += 1
        del data[key]
    

    encode('unicode-escape') 但这可能会使我的字符串长度增加一倍以上。