1. ホーム
  2. python

python3 プログラミングエラー [1]: ValueError: 解凍する値が足りない (期待値 2、取得値 1)

2022-02-20 23:31:20
<パス

ファイル(record.txt)のデータを分割して指定通りに保存するプログラムを実行すると、エラーが報告されるので、後で確認したり記憶したりするためにここに記録しておきます。

タスクの要件

1. record.txtファイルのデータ内容を読み込む

2. a の会話を一行ずつ "a_*.txt" というファイルに保存します("a:" を除いたものです)。

3. bの台詞を一行ずつ別々に、"b_*.txt"というファイルに保存する("b:"を除く)。

4. つのダイアログがあり、a_1.txt, b_1.txt, a_2.txt, b_2.txt, a_3.txt, b_3.txt, 6ファイル(ファイル内の異なるダイアログは "=======" で分離されている)で保存されています。

ソースコード

f = open('E:\\python\\\fishc-learing\\\record.txt')

a = []
b = []
count = 1

for each_line in f:
    if each_line[:3] ! = '====':
        # string splitting operation
        (role, line_spoken) = each_line.split(':', 1)
        if role == 'a':
            a.append(line_spoken)
        if role == 'b':
            b.append(line_spoken)
    else:
        # Separate save operations for files
        file_name_a = 'a_' + str(count) + '.txt'
        file_name_b = 'b_' + str(count) + '.txt'

        a_file = open(file_name_a, 'w')
        b_file = open(file_name_b, 'w')

        a_file.writelines(a)
        b_file.writelines(b)

        a_file.close()
        b_file.close()

        a = []
        b = []
        count += 1

 # Separate save operations for files
file_name_a = 'a_' + str(count) + '.txt'
file_name_b = 'b_' + str(count) + '.txt'

a_file = open(file_name_a, 'w')
b_file = open(file_name_b, 'w')

a_file.writelines(a)
b_file.writelines(b)

a_file.close()
b_file.close()

f.close()

実行結果

エラー報告の理由と解決策

このプログラムでは、読み込んだ各行を : で区切って2つに分ける必要があり、 : が見つからない場合はエラーが報告されます。エラーの原因は、record.txtファイルの : がチャイニーズコロンと誤記されていることです。record.txt文書だけ、コロンを英語のコロンに修正して、保存してください。

最適化されたコードです。

def save_file(a,b,count):
     # separate save operations for files
    file_name_a = 'a_' + str(count) + '.txt'
    file_name_b = 'b_' + str(count) + '.txt'

    a_file = open(file_name_a, 'w')
    b_file = open(file_name_b, 'w')

    a_file.writelines(a)
    b_file.writelines(b)

    a_file.close()
    b_file.close()

def split_file(file_name):
    f = open('E:\\python\\\fishc-learing\\record.txt')

    a = []
    b = []
    count = 1

    for each_line in f:
        if each_line[:3] ! = '====':
            # string splitting operation
            (role, line_spoken) = each_line.split(':', 1)
            if role == 'a':
                a.append(line_spoken)
            if role == 'b':
                b.append(line_spoken)
        else:
            save_file(a,b,count)

            a = []
            b = []
            count += 1

    save_file(a,b,count)

    f.close()

split_file('record.txt')