gpt4 book ai didi

python-3.x - 在 python 中将 ebcdic 解码为 ascii/可读文本

转载 作者:行者123 更新时间:2023-12-05 04:01:02 49 4
gpt4 key购买 nike

我有一个以“cp500”编码的 IBM 大型机文件(我被告知),该文件将被解码为 ascii 或可读文本。该文件是从 unix 服务器获取的,使用 IPSwitch 工具传输到 windows。

我已经尝试了下面的代码,但无法实现我想要的:

sample data = 'ðñðòðõÅäù@@@@@@@ððð :BÄÑðò÷øò@@@JaÈK' - in txt file

import codecs

with open(file, "rb") as ebcdic:
ascii_txt = codecs.decode(ebcdic, "cp500")
print(ascii_txt)

这会产生类型错误

"TypeError: decoding with 'cp500' codec failed (TypeError: a bytes-
like object is required, not '_io.BufferedReader')"

然后我试了这两个,

with open(file, 'r', encoding='cp500') as f:
for line in f:
print(line)

with codecs.open(file, 'r', encoding='cp500')
for line in f:
print(line)

我也尝试了国际编码“cp1140”格式 -

with open(file, 'r', encoding="cp1140") as f:
for line in f:
print(line)

我期待一个可读的输出 - 一个抄写本布局 - 像这样......

0001***********
0002...........
0003...........

但是以上三个都打印输出为:

C¢C£C¢C¥C¢C§CeCuC¾       C¢C¢C¢âCdCjC¢C¥C¼C½C¥   [/Ch.

而且我还尝试以“rb”模式读取文件:

with open(file, 'rb') as f:
for line in f:
print(line)

这会产生以下输出 -

b'\xc3\xb0\xc3\xb1\xc3\xb0\xc3\xb2\xc3\xb0\xc3\xb5\xc3\x85\xc3\xa4\xc3\xb9@@@@@@@\xc3\xb0\xc3\xb0\xc3\xb0 :B\xc3\x84\xc3\x91\xc3\xb0\xc3\xb2\xc3\xb7\xc3\xb8\xc3\xb2@@@Ja\xc3\x88K'

这是我第一次处理 ebcdic/mainframe 文件 - 任何对解码的帮助都将不胜感激!

提前致谢:)

最佳答案

我怀疑 EBCDIC 数据是用 Latin-1 解码的,并用 UTF-8 保存在您现在使用的 TXT 文件中。

让我们尝试使用示例的简化版本进行重构:

>>> copybook = '0102 [/H.'

这是最初制作的。此文本使用 EBCDIC 编码:

>>> '0102 [/H.'.encode('cp500')
b'\xf0\xf1\xf0\xf2@Ja\xc8K'

这就是原始大型机文件中写入的字节序列。您也可以在一般(非 Python)表示中这样写:

F0 F1 F0 F2 40 4A 61 C8 4B

现在这些字节是用 Latin-1 或 CP-1252(“Windows Latin-1”)解码的。如果您在 Windows 机器上执行此操作,可能会发生这种情况:

>>> with open(file) as f:
... text = f.read()
>>> text
'ðñðò@JaÈK'

您可以像这样模拟这种错误编码:

>>> '0102 [/H.'.encode('cp500').decode('latin1')
'ðñðò@JaÈK'

这是您在帖子开头显示的字符串。这已经比必须处理大型机文件这个单纯的问题更糟糕了——这是大型机文件的 mojibake!

现在,更糟糕的是,这个字符串被保存到一个使用 UTF-8 的文件中。我们也试试看:

>>> '0102 [/H.'.encode('cp500').decode('latin1').encode('utf8')
b'\xc3\xb0\xc3\xb1\xc3\xb0\xc3\xb2@Ja\xc3\x88K'

根据最后一段(您使用 'rb' 模式打开并打印输出),这些是包含在您的 TXT 文件中的字节。

现在这些字节不再是有效的 EBCDIC。Latin-1 和 UTF-8 的编码往返扭曲了内容:

>>> '0102 [/H.'.encode('cp500').decode('latin1').encode('utf8').decode('cp500')
'C¢C£C¢C¥ [/Ch.'

这是您在问题中显示的第一次尝试中获得的输出。

为了从这种情况中恢复过来,你需要消除扭曲:

>>> distorted = '0102 [/H.'.encode('cp500').decode('latin1').encode('utf8')
>>> distorted
b'\xc3\xb0\xc3\xb1\xc3\xb0\xc3\xb2@Ja\xc3\x88K'
>>> recovered = distorted.decode('utf8').encode('latin1').decode('cp500')
>>> recovered
'0102 [/H.'

...或者当从文件中读取时,您可以让open 为您执行第一个解码步骤:

>>> with open(file, encoding='utf8') as f:
... data = f.read()
... text = data.encode('latin1').decode('cp500')

对于完整的示例行,这会产生以下文本:

'010205EU9       000\x80\x9aâDJ02782   [/H.'

我不能 100% 确定这是原文。它包含一些控制字符(809A)和一个非 ASCII 字母(“â”)。也许 000...782 block 必须被解释为二进制 blob。但我希望这个分析能帮助你在这个问题上更进一步!

关于python-3.x - 在 python 中将 ebcdic 解码为 ascii/可读文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55674524/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com