首页 > 解决方案 > python中从文件到字符串utf-8的字符串

问题描述

所以我正在阅读和操作一个文件:

base_file = open(path+'/'+base_name, "r")
lines = base_file.readlines()

在此之后,我搜索并找到“raw_data”行的开头。

    if re.match("\s{0,100}raw_data: ",line):
        split_line = line.split("raw_data:")
        print(split_line)
        raw_string = split_line[1]

raw_data 的一个例子是:

raw_data: "&\276!\300\307 =\277\"O\271\277vH9?j?\345?@\243\264=\350\034\345\277\260\345\033\300\ 023\017(@z|\273\277L\}\277\210\\031\300\213\263z\277\302\241\033\300\000\207\323\277\247Oh>j\354 \215@\364\305\201\276\361+\202@t:\304\277\344\231\243@\225k\002\300vw\262\277\362\220j\300\"(\ 337\276\354b8\300\230\347H\300\201\320\204\300S;N\300Z0G\300>j\210\000@\034\014\220@\231\330J@\223\025 \236@\006\332\230\276\227\273\n\277\353@,@\202\205\215\277\340\356\022\300/\223\035\277\331\ 277\362\276a\350\013@)\353\276\277v6\316\277K\326\207\300`2)\300\004\014Q\300\340\267\271\300MV\305\300 \327\010\207\300j\346o\300\377\260\216\300[\332g\300\336\266\003\300\320S\272?6\300Y@\356\250\034\300 \367\277&\300\335Uq>o\010&\300r\277\252\300U\314\243\300\253d\377\300"

raw_string 将是

print(raw_data)

"&\276!\300\307 =\277\"O\271\277vH9?j?\345?@\243\264=\350\034\345\277\260\345\033\300\023\ 017(@z|\273\277L\}\277\210\\031\300\213\263z\277\302\241\033\300\000\207\323\277\247Oh>j\354\215 @\364\305\201\276\361+\202@t:\304\277\344\231\243@\225k\002\300vw\262\277\362\220j\300\"(\337\ 276\354b8\300\230\347H\300\201\320\204\300S;N\300Z0G\300>j\210\000@\034\014\220@\231\330J@\223\025\236 @\006\332\230\276\227\273\n\277\353@,@\202\205\215\277\340\356\022\300/\223\035\277\331\277\ 362\276a\350\013@)\353\276\277v6\316\277K\326\207\300`2)\300\004\014Q\300\340\267\271\300MV\305\300\327 \010\207\300j\346o\300\377\260\216\300[\332g\300\336\266\003\300\320S\272?6\300Y@\356\250\034\300\367 \277&\300\335Uq>o\010&\300r\277\252\300U\314\243\300\253d\377\300"

如果我试图读取这个文件,即使是转义字符,我也会得到一个字符到一个字符。所以,我的问题是如何将此纯文本转换为 utf-8 字符串,以便在读取 \300 而不是 4 个字符时可以有一个字符。

我试图在打开文件方法中传递“encondig =utf-8”但不起作用。

我做了同样的例子,将 raw_data 作为变量传递,它工作正常。

RAW_DATA = "&\276!\300\307 =\277\"O\271\277vH9?j?\345?@\243\264=\350\034\345\277\260\345\033\300\023\017(@z|\273\277L\\}\277\210\\\031\300\213\263z\277\302\241\033\300\000\207\323\277\247Oh>j\354\215@\364\305\201\276\361+\202@t:\304\277\344\231\243@\225k\002\300vw\262\277\362\220j\300\"(\337\276\354b8\300\230\347H\300\201\320\204\300S;N\300Z0G\300<I>>j\210\000@\034\014\220@\231\330J@\223\025\236@\006\332\230\276\227\273\n\277\353@,@\202\205\215\277\340\356\022\300/\223\035\277\331\277\362\276a\350\013@)\353\276\277v6\316\277K\326\207\300`2)\300\004\014Q\300\340\267\271\300MV\305\300\327\010\207\300j\346o\300\377\260\216\300[\332g\300\336\266\003\300\320S\272?6\300Y@\356\250\034\300\367\277&\300\335Uq>o\010&\300r\277\252\300U\314\243\300\253d\377\300"
print(f"Qnt -> {len(RAW_DATA)}") # Qnt -> 256
print(type(RAW_DATA))
at = 0
total = 0 
while at < len(RAW_DATA):
    fin = at+4
    substrin = RAW_DATA[at:fin]
    resu = FourString_float(substrin)

    at = fin

对于这个例子,\300 只是一个字符。

希望可以有人帮帮我。

标签: pythonencoding

解决方案


问题是在读取的文件中,转义\符号以 形式出现\,但在您提供的示例中,它们被作为其后面的数字的一部分进行评估。即,\276被读取为单个字符。

如果你运行:

RAW_DATA = r"&\276!\300\307 =\277\"O\271\277vH9?j?\345?@\243\264=\350\034\345\277\260\345\033\300\023\017(@z|\273\277L\\}\277\210\\\031\300\213\263z\277\302\241\033\300\000\207\323\277\247Oh>j\354\215@\364\305\201\276\361+\202@t:\304\277\344\231\243@\225k\002\300vw\262\277\362\220j\300\"(\337\276\354b8\300\230\347H\300\201\320\204\300S;N\300Z0G\300<I>>j\210\000@\034\014\220@\231\330J@\223\025\236@\006\332\230\276\227\273\n\277\353@,@\202\205\215\277\340\356\022\300/\223\035\277\331\277\362\276a\350\013@)\353\276\277v6\316\277K\326\207\300`2)\300\004\014Q\300\340\267\271\300MV\305\300\327\010\207\300j\346o\300\377\260\216\300[\332g\300\336\266\003\300\320S\272?6\300Y@\356\250\034\300\367\277&\300\335Uq>o\010&\300r\277\252\300U\314\243\300\253d\377\300"
print(f"Qnt -> {len(RAW_DATA)}") # Qnt -> 256
print(type(RAW_DATA))
at = 0
total = 0 
while at < len(RAW_DATA):
    fin = at+4
    substrin = RAW_DATA[at:fin]
    resu = FourString_float(substrin)
    at = fin

您应该得到与最初得到的相同的错误。请注意,我们使用的是raw-string文字而不是常规的字符串文字。这将确保\不会逃脱。

您需要评估RAW_DATA以强制它评估\. 你可以做类似RAW_DATA = eval(f'"{RAW_DATA}"')

import ast
RAW_DATA = ast.literal_eval(f'"{RAW_DATA}"')

请注意,第二个选项比直接执行更安全,eval因为您限制了可以执行的范围。


推荐阅读