0

私はかなり基本的なエンコーダー/デコーダーに取り組んでおり、独自のテキスト ファイル (文字列として) と独自のエンコーダー (文字列として: テキスト ファイルである必要があります) を入力できます。

ここに私のデコーダー関数があります:

def cDecode(file_name, encoder='standard_encoder.txt', save_new=True): # does not decode multi-lines correctly -- everything goes on a single line. See next comment
    '''Decodes <'file_name'> with the reverse method of <'encoder'>.'''
    if type(file_name) != str or type(encoder) != str: raise TypeError("<'file_name'> and <'encoder'> must be of type <'str'>.")
    if type(save_new) != bool: raise TypeError("<'save_new'> must be of type <'bool'>.")
    if file_name[-4:] != '.txt': file_name += '.txt'
    if encoder[-4:] != '.txt': encoder += '.txt'
    decoder_set = {}
    try:
        with open(encoder, 'r') as encoding_file:
            for line in encoding_file:
                line_parts = line.split(': ')
                my_key, my_value = line_parts[1], line_parts[0]

エラーはここにあると思います:「A: Ð」のように、(デコード ファイル内の) すべての文字が新しい行にあるため、「\n」を削除する必要があります。

                if '\n' in my_key:
                        loc = my_key.find('\n') # this may be the cause of the single-line of the decoding.
                        my_key = my_key[:loc] + my_key[loc + 1:]
                decoder_set[my_key] = my_value
        encoding_file.close()
    except IOError:
        encoder = 'standard_encoder.txt'
        with open(encoder, 'r') as encoding_file:
            for line in encoding_file:
                line_parts = line.split(': ')
                my_key, my_value = line_parts[1], line_parts[0]
                # every key has a new line character automatically because it's on a different line
                if '\n' in my_key:
                        loc = my_key.find('\n')
                        my_key = my_key[:loc] + my_key[loc + 1:]
                decoder_set[my_key] = my_value
        encoding_file.close()
    decodingKeys = decoder_set.keys()

関数の残りの部分は次のとおりです。

    if save_new:
        try:
            decoded_file_name = file_name[:-12] + '_decoded' + file_name[-4:]
            encoded_file = open(decoded_file_name, 'a+')
            with open(file_name, 'r') as my_file:
                for line in my_file:
                    de_line = ''
                    for char in line:
                        if char in decodingKeys: de_char = decoder_set[char]
                        else: de_char = char
                        de_line += de_char
                    encoded_file.write(de_line)
        except IOError:
            raise NameError(file_name + ' was not found. Decoding process terminated.')
    else:
        try:
            import os
            encoded_file = file_name[:-12] + '_decoded' + file_name[-4:]
            with open(file_name, 'r+') as my_file:
                for line in my_file:
                    de_line = ''
                    for char in line:
                        if char in decodingKeys: en_char = decoding_set[char]
                        else: de_char = char
                        de_line += de_char
                    encoded_file.write(de_line)
                os.remove(file_name)
                os.rename(encoded_file, file_name)
        except IOError:
            raise NameError(file_name + ' was not found. Decoding process terminated.')

複数行のテキスト ファイルがあるとします。

This is a test.
As is this one.
Good bye!

エンコードしてからデコードすると、次のように表示されますThis is a test.As is this one.Good bye!

どうすればこれを修正できますか? 次のように表示されることを期待しています。

This is a test.
As is this one.
Good bye!

ありがとう!

4

1 に答える 1

2

while を追加し'\n'て、行をファイルに書き戻します。

encoded_file.write(de_line+'\n')
于 2013-01-14T17:04:52.910 に答える