1

ftp サーバー上のファイル名リストを処理する要求があります。ただし、ファイル名にはアジア文字やその他の不明な文字が含まれています。したがって、gb2312 でデコードできるファイル名と iso-8859-1 でデコードできるファイル名を判断する必要があります。つまり、gb2312 を使用してファイル名リストを取得できない場合は、iso-88591-1 を使用して取得します。ftplibにある次の関数のコードの書き方がわかりません。

def retrlines(self, cmd, callback = None):
    """Retrieve data in line mode.  A new port is created for you.

    Args:
      cmd: A RETR, LIST, NLST, or MLSD command.
      callback: An optional single parameter callable that is called
                for each line with the trailing CRLF stripped.
                [default: print_line()]

    Returns:
      The response code.
    """
    if callback is None: callback = print_line
    resp = self.sendcmd('TYPE A')
##################I need to update here############################
    with self.transfercmd(cmd) as conn, \
             conn.makefile('r', encoding='iso-8859-1') as fp:
###################################################################
        while 1:

            line = fp.readline()
            print(line)

            if self.debugging > 2: print('*retr*', repr(line))
            if not line:
                break
            if line[-2:] == CRLF:
                line = line[:-2]
            elif line[-1:] == '\n':
                line = line[:-1]
            callback(line)
    return self.voidresp()
4

1 に答える 1

0

コードの多くが含まれていないため、何が起こっているのかを正確に伝えるのは困難です。ただし、原則として、操作しているデータのエンコーディングの使用法が一貫していない場合は、バイナリ モードで操作する必要があります。

したがって、エンコーディングをまったく渡さないようにしてください。うまくいけば、バイトデータが返され、各ファイルのニーズに応じてエンコード/デコードできます。

于 2012-10-27T08:08:29.963 に答える