あるcsvにある文字列のヘッダーを読み込み、別のcsvファイルのヘッダーをして書き込む方法。

投稿者: Anonymous

以前の質問(pythonにおけるopen関数のencoding引数について) において、python2を使っていたことで発生していた問題をpython3をインストールすることで解決をしようと試みたのですが、別の問題が発生してしまいました。
それは、以下のコードでserval_process.csvのヘッダーをpointer.csvのヘッダーとして書き写そうとすると以下のようなエラーが出てしまうことです。
どうすればエラーを出さずに処理を実行できますでしょうか?
教えて頂けると助かります。

コード

# coding: utf-8
import csv
import zipfile
import re
#import io
#import sys

#root_dir = '/Users/bigbird/Documents/UROP_data'
root_dir ='/home/firebird555/note2'

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()

エラー

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

serval_process.csvの内容
serval_process.csv

解決

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

g = open('pointer.csv', 'ab')

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

g = open('pointer.csv', 'a')

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *