在 USS 上的 Python 脚本中使用 iconv 将 UTF-8 转换为 EBCDIC

Posted

技术标签:

【中文标题】在 USS 上的 Python 脚本中使用 iconv 将 UTF-8 转换为 EBCDIC【英文标题】:UTF-8 to EBCDIC using iconv in Python-script on USS 【发布时间】:2020-01-29 19:08:18 【问题描述】:

我正在尝试将 utf-8 文件从 USS 上的目录列表转换为 ebcdic 文件,然后再将它们放入 z/OS 数据集。

使用我在 *** 上找到的辅助函数(谢谢!)我可以从 python 脚本中发出 shell 命令:

def r(cmd_line): 
     return Popen(cmd_line.split(), stdout=PIPE).communicate()[0]

有了这个,我可以从 USS 文件中分配和填充大型机数据集,使用

 r("tso alloc DSNAME(...) etc.")    # to allocate a mainframe DS and
 r("tso oget ...")                  # to populate the mainframe DS

但是:有些文件需要先转换,在 shellscript 中我会简单地使用

iconv -f UTF-8 -t IBM-1141 $utf8_file > $ebcdic_file

我完全不知道如何在 python (2.7) 中做到这一点?

因为python是新安装的,所以不能问我店里的任何人,我目前是唯一对它感兴趣的人。任何人的想法?提前非常感谢!

【问题讨论】:

见***.com/questions/191359/…。 你有什么理由必须使用 iconv 吗? @meat:谢谢,看起来不错;虽然这让我遇到了源文件的可能编码问题:UnicodeDecodeError: 'utf8' codec can't decode byte 0x78 in position 2: invalid continuation byte @Kevin:有什么替代方法? 如果它无法解码并且文件 看起来 像 UTF-8 格式,那么它可能是 ISO-8859-1。您还可以考虑使用文件标记,它会在打开文件时自动转换文件。 【参考方案1】:

虽然不是真正的 python 精神,但你可以通过将 USS 命令包装在 python 脚本中来做你想做的事。这是一个例子:

#!/bin/env python

from cStringIO import StringIO
import os
import sys

def r(cmd):
    import subprocess
    return subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]

def allocate_dataset(dsName):
    name = "'" + dsName + "'"
    out = r(['/bin/tso', 'alloc',  'ds(' + name + ')',  'space(6000 2000)',  'track', 'lrecl(80)',
             'dsntype(library)', 'blksize(3200)',  'recfm(f b)',  'dir(2)',  'new'])
    for line in out.split():
        print line

def not_allocated(dsName):
    name = "'" + dsName + "'"
    out = r(['/bin/tsocmd', 'listds ' + name])
    for line in out.split():
        if "NOT IN CATALOG" in out:
            return True
    return False

def ascii_to_ebcdic(from_codepage, to_codepage, fileName):
    os.system('iconv -f' + from_codepage + ' -t' + to_codepage + ' <' + fileName + ' >ebcdic_' + fileName)

def copy_to_dataset(fileName, dsName, memberName):
    dsn = "//'" + dsName + '(' + memberName + ")'"
    os.system('cp -T ' + fileName + ' "' + dsn + '"')

def main():
    dsName = "HLQ.MY.PYTHON"
    if not_allocated(dsName):
        print("Allocating '" + dsName + "' data set")
        allocate_dataset(dsName)
    ascii_to_ebcdic("UTF-8", "IBM-1047", "test.txt")
    copy_to_dataset("ebcdic_test.txt", "HLQ.MY.PYTHON", "TXT")
    member = "//'HLQ.MY.PYTHON(TXT)'"
    os.system('cat -v "' + member + '"')

main()

【讨论】:

那真是太棒了!感谢您的示例 - 特别是。用于显示引用中的引用如何工作 (' " some var " ')。试图通过反复试验来解决这个问题真的很乏味。 ;-)

以上是关于在 USS 上的 Python 脚本中使用 iconv 将 UTF-8 转换为 EBCDIC的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 .ico 文件存储在 vbscript 中?

[PLC]如何通过USS协议实现S7-1200 与G120变频器的通信

从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件

大型机迁移到 USS/Github

Azure Web 应用程序:favicon.ico 上的 HTTP 错误 500

linux--VSS/RSS/PSS/USS