【问题标题】:encoding strings in python在python中编码字符串
【发布时间】:2015-03-13 01:01:42
【问题描述】:

我正在尝试对从 Excel 文档中获取的一段文本进行编码。它包含各种奇怪的字符,如引号、反斜杠、括号等。将它转换为 Python 兼容字符串以便我可以处理它并将其写入变量的正确方法是什么?

ExampleText = "MINIMUM TRACK FASTENING SHALL BE 0.145" DIAMETER POWDER ACTUATED FASTENERS (P.A.F.S) SPACED ON 8" CENTERS FOR BEARING WALLS, AND AT 12" O.C. FOR NON-LOAD BEARING WALLS (U.N.O.), WITH 1 1/2" MINIMUM PENETRATION INTO CONCRETE. AT X-BRACED SHEAR WALLS, TRACK SHALL BE ATTACHED PER DETAILS.  At Infinity Shear Panels (ISP’S) attach to slab w/ 0.145" x 1 1/2” powder actuated fasteners spaced on 4” centers (HILTI DS 37 P10 or equal) -OR- (6) 3/8" DIA. 2205 expansion anchors w/ 2 1/2" min. embedment - OR-Simpson "Titen" screws  @ 6" o.c."

我试过了:str(ExampleText) 但显然失败了。

感谢您的帮助!

ps。这是我得到的错误: UnicodeEncodeError: ('unknown', '\x00', 0, 1, '') ps2。我在 IronPython2.7 上,我知道很糟糕 :-(

【问题讨论】:

  • 那么你已经有一个ExampleText 对象了吗?是什么类型(print type(ExampleText)
  • 它是一个字符串对象。当我执行 ExampleText.GetType() 它返回 System.String
  • 我也收到此错误 UnicodeEncodeError: ('unknown', '\x00', 0, 1, '')
  • 所以ExampleText 对象不在python 中,它类似于VBA 或其他东西——但您想在python 脚本中使用该?用单引号将整个字符串括起来怎么样:ExampleText = '"MINIMUM ... o.c."'
  • 您列出的字符串中没有单引号 -- 如果您将该字符串用单引号括起来,这将是一个开始。

标签: python string encode


【解决方案1】:

您可以使用re 包中的escape() 函数:

>>> import re
>>> re.escape(ExampleText)
    '\\"MINIMUM\\ TRACK\\ FASTENING\\ SHALL\\ BE\\ 0.145\\"\\ DIAMETER ...'
>>> ExampleText = ExampleText.decode('string_escape')
    '"MINIMUM TRACK FASTENING SHALL BE 0.145" DIAMETER ...'

escape() 函数将使用双反斜杠等价物转义所有非字母数字字符。这应该可以很好地处理您的输入字符串。

【讨论】:

    【解决方案2】:

    如果给定的代码与您所拥有的完全匹配,那就难怪它有问题了。你用双引号括起来,但字符串包含双引号。保持原样,当解释器看到下一个双引号时,字符串将结束,然后会有一堆它无法识别的术语(如DIAMETERPOWDER),然后最终另一个字符串将开始,等等开。

    您需要用反斜杠转义字符串的双引号,或者用每边三个引号将字符串括起来。

    ExampleText = "MINIMUM TRACK FASTENING SHALL BE 0.145\" DIAMETER POWDER ACTUATED FASTENERS (P.A.F.S) SPACED ON 8\" CENTERS FOR BEARING WALLS, AND AT 12\" O.C. FOR NON-LOAD BEARING WALLS (U.N.O.), WITH 1 1/2\" MINIMUM PENETRATION INTO CONCRETE. AT X-BRACED SHEAR WALLS, TRACK SHALL BE ATTACHED PER DETAILS.  At Infinity Shear Panels (ISP’S) attach to slab w/ 0.145\" x 1 1/2\" powder actuated fasteners spaced on 4\" centers (HILTI DS 37 P10 or equal) -OR- (6) 3/8\" DIA. 2205 expansion anchors w/ 2 1/2\" min. embedment - OR-Simpson \"Titen\" screws  @ 6\" o.c."
    

    ExampleText = """MINIMUM TRACK FASTENING SHALL BE 0.145" DIAMETER POWDER ACTUATED FASTENERS (P.A.F.S) SPACED ON 8" CENTERS FOR BEARING WALLS, AND AT 12" O.C. FOR NON-LOAD BEARING WALLS (U.N.O.), WITH 1 1/2" MINIMUM PENETRATION INTO CONCRETE. AT X-BRACED SHEAR WALLS, TRACK SHALL BE ATTACHED PER DETAILS.  At Infinity Shear Panels (ISP’S) attach to slab w/ 0.145" x 1 1/2” powder actuated fasteners spaced on 4” centers (HILTI DS 37 P10 or equal) -OR- (6) 3/8" DIA. 2205 expansion anchors w/ 2 1/2" min. embedment - OR-Simpson "Titen" screws  @ 6" o.c."""
    

    SO 的内置语法高亮显示您的示例由多个字符串组成,而我的示例是一个连续的字符串。

    另外,字符串只包含正斜杠,没有反斜杠,所以没有问题。如果有反斜杠并且您想解决它,您可以在字符串前面加上 r 以表示原始字符串:r'hello\nworld 打印为 hello\nworld。原始字符串唯一无法处理的是字符串中的最后一个字符是反斜杠时。通过在之后添加它来解决这个问题:r'C:\Users\jsmith' + '\\'r'C:\Users\jsmith' '\\'(在连接文字字符串时,+ 不是绝对必要的)。

    仅当您将字符串写入源代码时才需要这样做。来自input() 等外部来源的字符串或文件会被自动处理。

    【讨论】:

      【解决方案3】:

      来自我们在 cmets 中的对话

      # -*- coding: utf-8 -*-
      
      ExampleText = '"MINIMUM TRACK FASTENING SHALL BE 0.145" DIAMETER POWDER ACTUATED FASTENERS (P.A.F.S) SPACED ON 8" CENTERS FOR BEARING WALLS, AND AT 12" O.C. FOR NON-LOAD BEARING WALLS (U.N.O.), WITH 1 1/2" MINIMUM PENETRATION INTO CONCRETE. AT X-BRACED SHEAR WALLS, TRACK SHALL BE ATTACHED PER DETAILS.  At Infinity Shear Panels (ISP’S) attach to slab w/ 0.145" x 1 1/2” powder actuated fasteners spaced on 4” centers (HILTI DS 37 P10 or equal) -OR- (6) 3/8" DIA. 2205 expansion anchors w/ 2 1/2" min. embedment - OR-Simpson "Titen" screws  @ 6" o.c."'
      
      print(ExampleText)
      

      编码标题行是必需的,因为其中包含非 ASCII 字符。

      您也可以使用'''""" 包装文字:

      x = '''some string'''
      x = """some string"""
      

      请注意,更好的解决方案可能是直接从数据中获取字符串,而不是使用 csv 之类的包复制/粘贴到您的代码中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多