Загрузка текстовых файлов с Python и ftplib. FTP от z/os

C# не является ориентированным языком AOP. Это имеет некоторые функции AOP, и можно эмулировать некоторых других, но AOP создания с C# является болезненным.

я искал способы сделать точно, что Вы хотели сделать, и я не нашел простого способа сделать это.

Насколько я понимаю, это - то, что Вы хотите сделать:

[Log()]
public void Method1(String name, Int32 value);

и чтобы сделать это, у Вас есть две основных опции

  1. , Наследовали Ваш класс от MarshalByRefObject или ContextBoundObject и определяют атрибут, который наследовался IMessageSink. Эта статья имеет хороший пример. Необходимо рассмотреть nontheless, как который с помощью MarshalByRefObject понизится производительность черт, и я имею в виду его, я говорю о 10x производительность, потерянная, так думайте тщательно прежде, чем попробовать это.

  2. другая опция состоит в том, чтобы ввести код непосредственно. Во времени выполнения имея в виду необходимо будет использовать отражение, чтобы "считать" каждый класс, получить его атрибуты и ввести вызов appropiate (и в этом отношении я думаю, что Вы не могли использовать Отражение. Испустите метод, поскольку я думаю Отражение. Испустите не позволил бы Вам вводить новый код в уже существующем методе). Во время проектирования это будет означать создавать расширение компилятора CLR, который у меня нет честно идеи о том, как это сделано.

заключительная опция использует платформа МОК . Возможно, это не идеальное решение как большинство работ платформ МОК путем определения точек входа, которые позволяют методам быть сцепленными, но, в зависимости от того, что Вы хотите к achive, который мог бы быть справедливым приближением.

5
задан paxdiablo 8 November 2009 в 11:30
поделиться

2 ответа

Вы должны иметь возможность загрузить файл в виде двоичного файла (используя retrbinary ) и использовать модуль кодеков для преобразования из EBCDIC в любая кодировка вывода, которую вы хотите. Вы должны знать конкретную кодовую страницу EBCDIC, используемую в системе z / OS (например, cp500). Если файлы маленькие, вы даже можете сделать что-то вроде (для преобразования в UTF-8):

file = open(ebcdic_filename, "rb")
data = file.read()
converted = data.decode("cp500").encode("utf8")
file = open(utf8_filename, "wb")
file.write(converted)
file.close()

Обновление: Если вам нужно использовать retrlines , чтобы получить строки, и ваши строки возвращаясь в правильную кодировку, ваш подход не будет работать, потому что обратный вызов вызывается один раз для каждой строки. Таким образом, в обратном вызове последовательность будет строкой, а цикл for будет записывать отдельные символы из строки в вывод, каждый в отдельной строке . Так что вы, вероятно, захотите сделать self.write (sequence + "

3
ответ дан 14 December 2019 в 04:44
поделиться

Ваш метод writerelineswitheol добавляет '\ r \ n' вместо '\ n', а затем записывает результат в файл, открытый в текстовом режиме. Эффект, независимо от того, на какой платформе вы работаете, будет нежелательным '\ r'. Просто добавьте '\ n', и вы получите соответствующее окончание строки.

Надлежащую обработку ошибок не следует относить к версии "наворотов". Вы должны настроить обратный вызов так, чтобы ваш файл open () находился в try / except и сохранял ссылку на дескриптор выходного файла, ваш вызов записи находился в try / except, и у вас был метод callback_obj.close (), который вы используете, когда retrlines () явно возвращается к file_handle. close () (в try / except) - таким образом вы получаете явную обработку ошибок, например, сообщения "не могу (открыть | записать в | закрыть) файл X, потому что Y" И вы избавляетесь от необходимости думать о том, когда ваши файлы будут должны быть неявно закрыты, и рискуете ли вы исчерпать дескрипторы файлов.

Python 3.x ftplib.FTP.retrlines () должен предоставить вам объекты str, которые фактически являются строками Unicode, и вам нужно будет их закодировать, прежде чем писать их - если только кодировка по умолчанию не latin1, что было бы довольно необычно для Windows. У вас должны быть тестовые файлы со (1) всеми возможными 256 байтами (2) всеми байтами, действительными в ожидаемой кодовой странице EBCDIC.

И вы избавляетесь от необходимости думать о том, когда ваши файлы будут неявно закрыты и рискуете ли вы исчерпать дескрипторы файлов.

Python 3.x ftplib.FTP.retrlines () должен предоставить вам объекты str, которые в действительности являются Unicode строки, и вам нужно будет их закодировать, прежде чем писать, - если кодировка по умолчанию не latin1, что было бы довольно необычно для окна Windows. У вас должны быть тестовые файлы со (1) всеми возможными 256 байтами (2) всеми байтами, действительными в ожидаемой кодовой странице EBCDIC.

И вы избавляетесь от необходимости думать о том, когда ваши файлы будут неявно закрыты и рискуете ли вы исчерпать дескрипторы файлов.

Python 3.x ftplib.FTP.retrlines () должен предоставить вам объекты str, которые в действительности являются Unicode строки, и вам нужно будет закодировать их, прежде чем писать, - если кодировка по умолчанию не latin1, что было бы довольно необычно для окна Windows. У вас должны быть тестовые файлы с (1) всеми возможными 256 байтами (2) всеми байтами, действительными в ожидаемой кодовой странице EBCDIC.

[несколько замечаний по «санитарии»]

  1. Вам следует подумать об обновлении вашего Python с 3.0 (версия для проверки концепции) до 3.1.

  2. Чтобы облегчить лучшее понимание вашего кода, используйте «i» в качестве идентификатора только в качестве индекса последовательности и только в том случае, если вы безвозвратно приобрели эту привычку из FORTRAN 3 или более десятилетий назад: -)

  3. Две проблемы, обнаруженные таким образом far (добавление терминатора строки к каждому символу, неправильный терминатор строки) появилось бы при первом тестировании.

1
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: