Строка из файла в строку utf-8 в python - PullRequest
0 голосов
/ 18 июня 2020

Итак, я читаю файл и управляю им с помощью:

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 "

Если я попытался прочитать этот файл, я получу один символ к одному символу даже для escape-символов. Итак, мой вопрос в том, как преобразовать этот простой текст в строку 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 - это только один символ.

Надеюсь, кто-нибудь мне поможет.

1 Ответ

2 голосов
/ 18 июня 2020

Проблема в том, что в прочитанном файле escape-символы \ входят как \, но в приведенном вами примере они оцениваются как часть числовых значений, следующих за ним. ie, \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, поскольку вы ограничиваете объем того, что может быть выполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...