【问题标题】:String from file to string utf-8 in pythonpython中从文件到字符串utf-8的字符串
【发布时间】:2020-10-08 00:17:16
【问题描述】:

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

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 只是一个字符。

希望有人可以帮助我。

【问题讨论】:

    标签: python encoding


    【解决方案1】:

    问题在于,在读取的文件中,转义符号 \\ 的形式出现,但在您提供的示例中,它们被作为其后数字的一部分进行评估。即,\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 更安全,因为您限制了可以执行的范围。

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 2019-01-13
      • 2018-01-05
      • 2012-01-20
      • 2016-05-31
      • 1970-01-01
      • 2014-03-07
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多