51554


以前の質問([https://ja.stackoverflow.com/questions/51521/pythonにおけるopen関数のencoding引数について](https://ja.stackoverflow.com/questions/51521/python%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bopen%E9%96%A2%E6%95%B0%E3%81%AEencoding%E5%BC%95%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6))
において、Python2 を使っていたことで発生していた問題を Python3
をインストールすることで解決をしようと試みたのですが、別の問題が発生してしまいました。  
それは、以下のコードで serval_process.csv のヘッダーを pointer.csv
のヘッダーとして書き写そうとすると以下のようなエラーが出てしまうことです。  
どうすればエラーを出さずに処理を実行できますでしょうか?  
教えて頂けると助かります。

コード

[code]

    # coding: utf-8
    import csv
    import zipfile
    import re
    #import io
    #import sys
    
    root_dir = '/Users/hoge'
    
    with open('serval_process.csv', 'r') as f:
        reader = csv.reader(f)
        #pointer.csvという新しいcsvファイルを以下で作る。
        g = open('pointer.csv', 'ab') #閉じるのを忘れずに...!
        csvWriter = csv.writer(g)
        
        header = next(reader)  # ヘッダーを読み飛ばしたい時
        csvWriter.writerow(header) #エラーが出る...。
        
        for row in reader:# serval_process.csvのデータを1行づつ取得できる
            local = row[2]#localでzipファイルのある場所
            with zipfile.ZipFile(local, 'r') as zf: #zipファイルを読む
                files = [info.filename for info in zf.infolist() if info.filename.endswith('.txt')]
                for f in files:
                    listData = [] #listの初期化
                    listData.append(row[0])
                    listData.append(row[1])
                    bindata = zf.read(f)
                    text = bindata.decode(row[3])#この後テキストデータを整形した上でTextに保存したい。
                    #テキストの先頭にあるヘッダとフッタを削除
                    text = re.split(r'\-{5,}',text)[2]
                    text = re.split(r'底本：', text)[0]
                    #空白文字、改行およびタブの除去
                    text = text.strip()
                    #上で加工した書き込むテキストを開く。また、テキストの場所をpointer.csvに記録する。
                    text_file = root_dir + '/Text/'+ f
                    listData.append(text_file)
                    with open(text_file, 'w', encoding="utf-8") as fp:#エラーが発生してしまう場所
                        fp.write(text)
                    listData.append('utf-8')
                    csvWriter.writerow(listData) #1行書き込み
        g.close()
    
[/code]

エラー

[code]

    Traceback (most recent call last):
    File "ExtractText.py", line 18, in <module>
        csvWriter.writerow(header) #エラーが出る...。
    TypeError: a bytes-like object is required, not 'str'
    
[/code]


CC BY-SA 4.0
2018-12-27T09:10:22.820
51553
2022-06-15T16:31:04.093
2022-06-15T16:31:04.093
31249
31249
question
python python3 csv
あるcsvファイルにある文字列のヘッダーを読み込み、別のcsvファイルのヘッダーとして書き込む方法。


出力先のファイルをバイナリモードで開いているのが原因ではないでしょうか。

[code]

    g = open('pointer.csv', 'ab')
    
[/code]

出力するのが文字列なら以下を試してください。

[code]

    g = open('pointer.csv', 'a')
    
[/code]

参考: 英語版SOでの類似質問(とその回答)より  
<https://stackoverflow.com/a/33054552/2322778>


CC BY-SA 4.0
2018-12-27T09:32:22.843
51554
2018-12-27T09:32:22.843
3060
51553
answer


`open('pointer.csv', 'ab')`を`open('pointer.csv',
'a')`に書き換えてください。(第2引数から`b`を削る)

`open('pointer.csv',
'ab')`で[ファイルを開く](https://docs.python.jp/3/tutorial/inputoutput.html#reading-
and-writing-files)と、`a`追記(append)モード＋バイナリモードでファイルを開きます。  
このモードで文字列型の`header`を書き込むと、「文字列ではなく、バイト型のオブジェクトが要求されています(意訳)」というエラーになります。

> a bytes-like object is required, not 'str'

※エラーメッセージを載せていただいたので、原因が特定しやすくなりました。


CC BY-SA 4.0
2018-12-27T09:33:47.220
51555
2018-12-27T09:33:47.220
9820
51553
answer