在 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的主要内容,如果未能解决你的问题,请参考以下文章
[PLC]如何通过USS协议实现S7-1200 与G120变频器的通信
从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件