UTF-8 - EBCDI C с использованием iconv в Python -скрипте USS - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь преобразовать файлы utf-8 из списка каталогов на USS в файлы ebcdi c ПЕРЕД помещением их в наборы данных z / OS.

Используя вспомогательную функцию, которую я нашел в stackoverflow (спасибо за это!), Я могу выдавать команды оболочки из скрипта python:

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

Однако: сначала необходимо преобразовать некоторые файлы, которые в коде оболочки я бы просто кодировал с помощью

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

и я совершенно не понимаю, как это сделать в python (2.7)?

Не могу никого спросить в моем магазине, так как python был недавно установлен, и в данный момент я заинтересован только в этом. Есть идеи? Заранее большое спасибо!

1 Ответ

0 голосов
/ 30 января 2020

Хотя это и не соответствует истинному духу 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()
...