python - 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 只是一个字符。
希望可以有人帮帮我。
解决方案
问题是在读取的文件中,转义\
符号以 形式出现\
,但在您提供的示例中,它们被作为其后面的数字的一部分进行评估。即,\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
因为您限制了可以执行的范围。
推荐阅读
- laravel - 如何将此 sql 查询转换为 laravel 查询?从下面生成查询总和,但我需要根据客户的产品求和
- swift - 如何使用 SwiftUI 关闭多个视图
- angular - 如何为影院屏幕生成座位布局
- wicket - 有什么方法可以实现 YearMonthPicker?
- css - 有没有办法使用 CSS 来定位同一类中的某些数据?
- c - 为什么会出现“无效或不支持的图像格式”错误?
- go - 在 go 中缓冲读写相同的文件
- location - 我已经输入了 MNC、MCC、LAC 和 CID 的值,但邮递员抛出 CID 错误应该是 less 如何解决这个问题?
- postgresql - 使用 COPY 命令将 csv 文件从 S3 上传到 Postgres 时遇到问题
- tomcat - Tomcat 不适用于 Nginx 反向代理