【问题标题】:How can I read a byte array file of strings?如何读取字符串的字节数组文件?
【发布时间】:2021-08-08 23:28:04
【问题描述】:

有一个文件,内容如下:

b'prefix:input_text'
b'oEffect:PersonX \xd8\xaf\xd8\xb1 \xd8\xac\xd9\x86\xda\xaf ___ \xd8\xa8\xd8\xa7\xd8\xb2\xdb\x8c \xd9\x85\xdb\x8c \xda\xa9\xd9\x86\xd8\xaf'
b'oEffect:PersonX \xd8\xaf\xd8\xb1 \xd8\xac\xd9\x86\xda\xaf ___ \xd8\xa8\xd8\xa7\xd8\xb2\xdb\x8c \xd9\x85\xdb\x8c \xda\xa9\xd9\x86\xd8\xaf'

这是我尝试读取这些行并将它们转换为可读的 utf 字符,但它仍然在输出文件中显示相同的字符串:

f = open(input_file, "rb")
for x in f:
  inpcol.append(x.decode('utf-8'))

f = open(pred_file, "r")
for x in f:
  predcol.append(x)

f = open(target_file, "r")
for x in f:
  targcol.append(x)
data =[]
for i in tqdm(range(len(targcol))):
  data.append([inpcol[i],targcol[i],predcol[i]])

pd.DataFrame(data,columns=["input_text","target_text","pred_text"]).to_csv(f"{path}/merge_{predfile}.csv", encoding="utf-8")
print("Done!")

输出文件是:

,input_text,target_text,pred_text
0,"b'prefix:input_text'
","target_text
","ﺏﺭﺎﯾ ﺩﺮﮐ ﻮﻀﻌﯿﺗ
"
1,"b'xNeed:PersonX \xd8\xaf\xd8\xb1 \xd8\xac\xd9\x86\xda\xaf ___ \xd8\xa8\xd8\xa7\xd8\xb2\xdb\x8c \xd9\x85\xdb\x8c \xda\xa9\xd9\x86\xd8\xaf'
","ﺞﻨﮕﯾﺪﻧ
","ﺏﺭﺎﯾ ﭗﯾﺩﺍ ﮎﺭﺪﻧ ﯽﮐ ﺖﯿﻣ
"

如您所见,问题存在于输入行,但不存在于目标和预测行(尽管被打乱但没关系)

【问题讨论】:

  • 文件内容不清楚。请编辑您的问题并复制其内容(在文本编辑器中使用),然后将其粘贴到其中。
  • 我用vim打开了文件,它们只是unicode字符。它是 vim 显示的。然而,它们实际上是波斯字母,类似于 علی به مدرسه رفت
  • 然后将其中的 Unicode 字符粘贴到您的问题中——因为这是必须从文件中读取的内容。
  • @martineau 它们就像它所显示的那样,没有区别。但是,目标和预测文件以波斯语显示,但输入文件保持原样。
  • 嗯,由于b' 前缀和结尾' 引号字符,文件的内容似乎在Python bytes string literal syntax 中似乎很奇怪。也许您可以将文件的副本放在某处(例如pastebin.com)并将指向它的链接放入您的问题中。

标签: python string utf-8


【解决方案1】:

似乎有人以错误的方式写入字节。有人使用str(bytes) 而不是bytes.decode('utf-8')。或者可能是为 Python 2 创建的代码,它以与 Python 3 不同的方式处理字节和字符串。


如果您可以更正编写它的代码,那么您必须修复文本

text = "b'oEffect:PersonX \xd8\xaf\xd8\xb1 \xd8\xac\xd9\x86\xda\xaf ___ \xd8\xa8\xd8\xa7\xd8\xb2\xdb\x8c \xd9\x85\xdb\x8c \xda\xa9\xd9\x86\xd8\xaf'"

裁剪b' '

text = text[2:-1]

使用特殊编码'raw_unicode_escape'转换回bytes

text = text.encode('raw_unicode_escape')

并正确转换为string

text = text.decode()

现在

print(text)

给我

oEffect:PersonX در جنگ ___ بازی می کند

编辑:

它似乎已将代码转换为带有双斜杠的字符串,例如 b'\\xd8',但 print() 可能会将其显示为单斜杠,但 print(repr()) 可能会以双斜杠显示。

可能需要更多decode/encode 才能正确转换。

text = "b'xNeed:PersonX \\xd8\\xaf\\xd8\\xb1 \\xd8\\xac\\xd9\\x86\\xda\\xaf'"
print(repr(text))
print(text)

text = text[2:-1]
text = text.encode('raw_unicode_escape')
text = text.decode('unicode_escape')
text = text.encode('raw_unicode_escape')
text = text.decode()
print(text)

【讨论】:

  • 它打印了预期的输出,但是我试图在读取文件的循环中做这些,仍然没有成功,我尝试更多
  • 首先您可以使用print(..)print(type(..)) 在循环读取时检查变量中的内容。我无法测试您的文件和代码,因此无法提供更多帮助。
  • 我应该在哪里做这些?我在循环中尝试读取文件但没有运气,我也尝试写没有运气for i in tqdm(range(len(targcol))): text = inpcol[i] text = text[2:-1] text = text.encode('raw_unicode_escape') text = text.decode() data.append([text,targcol[i],predcol[i]])
  • 在读取循环中,类型为str 还要注意它打印的每一行不带引号,是否有效?
  • 谢谢,但我没有成功!我不知道你把它们放在一个文件里你会成功还是不成功,无论如何,谢谢,我投票赞成
猜你喜欢
  • 2013-02-28
  • 2015-06-04
  • 2013-03-14
  • 2019-05-07
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多