如何在从文件读取时解码转义序列但保留字符串表示

时间:2018-01-19 15:13:31

标签: python character-encoding

我正在阅读一个文本文件,其中包含以编码方式转储的binaray数据的行,但仍作为字符串(至少在emacs中):

E.g:

\240\263\205k\347\301\360G\224\217yr\335\355#\333\0320^\242\367\021\227C\035\000\207\016\327\201\360\242

这对我来说非常好,当我在该文件中读到时,我想保留这个字符串,而不是以任何方式解码或更改它。但是,当我在文件中读取时,python会进行解码。我该如何防止这种情况?

with open("/path/to/file") as file:
     for line in file:
         print line

输出结果如下:

'���k���G�r��#�\0320^��\021�C\035\000�\016ׁ��'

但应该是这样的:

\240\263\205k\347\301\360G\224\217yr\335\355#\333\0320^\242\367\021\227C\035\000\207\016\327\201\360\242

编辑:但是,此编码数据不是唯一包含的数据,而是较大文本转储的一部分。

3 个答案:

答案 0 :(得分:1)

如果你真的想要八进制表示,你可以定义一个将其打印出来的函数。

import string

def octal_print(s):
    print(''.join(map(lambda x: x if x in string.printable else '\\'+oct(ord(x))[2:], s)))

s = '\240\263\205k\347\301\360G\224\217yr\335\355#\333\0320^\242\367\021\227C\035\000\207'
octal_print(s)
# prints:
\240\263\205k\347\301\360G\224\217yr\335\355#\333\320^\242\367\21\227C\35\0\207

答案 1 :(得分:1)

您可以使用'rb'选项将文件读取为二进制文件,它将保留数据

<强> EX:

with open(PathToFile, 'rb') as file:
    raw_binary_data = file.read()

print(raw_binary_data)

答案 2 :(得分:0)

根据詹姆斯的回答我调整了USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"; deviceMetrics.put("width", 375); deviceMetrics.put("height", 667); deviceMetrics.put("pixelRatio", 2.0); mobileEmulation.put("deviceMetrics", deviceMetrics); mobileEmulation.put("userAgent", USER_AGENT ); options.setExperimentalOption("mobileEmulation", mobileEmulation); driver = new ChromeDriver(options); @FindBy(id = "off-canvas-header-trigger) protected WebElement clicknavbar; public MobilePage clicknavigation() { driver.click(clicknavbar, "Unable to click navigation bar"); return this; } public boolean click(WebElement element, String errorMessage) { softAssert.setCause(null); boolean success = true; try { element.click(); } catch (Exception e) { throw e; } } 函数来区分实际的八进制和无辜的角色。

octal_print
相关问题