質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.40%

  • Python 3.x

    10699questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • CSV

    918questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

文献文字列を出版年の正規表現(2019)で切って異なる列に格納したcsvを作りたい。1文ならばできるが、連続処理でエラーが出る

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 165

前提・実現したいこと

文献リストを出版年を正規表現として認識して、それを境に3つの列に分けてcsvの3つの列に入れたい。1行であれば、文字列をそのまま与えればできた(試したこと参照)。これを複数の文献(行)を連続して処理することがうまくいかない。元の文献リストはテキストデータ。現在はこれをcsvファイルで与えて、列を分割することを考えているがテキストデータからできる方法があるならばそれでも良い。

具体的な文献リストの例

石原千秋ほか(1992)『読むための理論』世織書房.
Green JL, Plotkin J B (2007) A statistical theory for sampling species abundances. Ecology Letters, 10:1037-1045

 

これを(1992)などの年号の正規表現で切って3つの列を作りcsvに格納したい

 

期待される結果

列1 列2 列3
Green JL, Plotkin J B 2007 A statistical theory for sampling species abundances. Ecology Letters, 10:1037-1045
石原千秋ほか 1992 『読むための理論』世織書房

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

TypeError: expected string or bytes-like object 
#"(row)"の部分

該当のソースコード

import re, csv, os
csv_rows =[]
csv_file_obj=open("example_ref2.csv", encoding="UTF-8")#csv読み込み、エンコードの指定
reader_obj=csv.reader(csv_file_obj)
ref_year_regex = re.compile(r'(\(\d\d\d\d\))')#")"ではなく\)とすることで、”かっこ”をエスケープした。正規表現(年)を認識

for row in reader_obj:    #csvの上の行から順番に読み込んで、分割処理をする
    ref1_split=ref_year_regex.split(row)#上で作ったregex(compile)を用いて文献を分ける。ここで行ごとの読み込みにエラー
    csv_rows.append(row)
csv_file_obj.close()

#csvの書き出し
csv_file_obj = open("output.csv", 'w', newline='')
csv_writer =csv.writer(csv_file_obj)
for row in csv_rows:
    csv_writer.writerrow(row)
csv_file_obj.close()

試したこと

ひとまず1行であれば以下のソースコードでやりたいことを実現できる。これを複数行で実現したい。

#正規表現で出版年の文字列を検出する
import re, csv
ref1='石原千秋ほか(1992)『読むための理論』世織書房.'
ref_year_regex = re.compile(r'(\(\d\d\d\d\))')#")"ではなく\)とすることで、”かっこ”をエスケープした
mo = ref_year_regex.search(ref1)#これでmoに出版年を入れることができた
print(mo.group())
#output=(1992)

#検出した出版年で文献データを3つに分割し、リストを作る
ref1_split=ref_year_regex.split(ref1)#上で作ったregex(compile)を用いて文献を分けることができた。
ref1_split
#output=['石原千秋ほか', '(1992)', '『読むための理論』世織書房.']

#csvへの書き込み
output_file=open('output3.csv', 'w', newline='')
output_writer = csv.writer(output_file)
output_writer.writerow(ref1_split)
output_file.close()

#これでひとまず上のリストをcsvに書き込むことができる。これを複数行に対して繰り返すことができれば。

補足情報(FW/ツールのバージョンなど)

jupyter notebook使用
python3.6.5

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

以下のように、入力は単なるテキストファイルとして処理したほうが簡潔に書けます。

import re
import csv

r = re.compile(r'(\(\d\d\d\d\))')

with open('example_ref2.csv') as fin:
    lines = fin.readlines()
    with open('output.csv', 'w', newline='') as fout:
        writer = csv.writer(fout)
        for line in lines:
            line = r.split(line.rstrip())
            writer.writerow(line)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/12 17:27

    簡潔な方法を教えていただきありがとうございます。encoding(encoding=shift_jisで処理)等で少し手こずりましたが、最終的に得たいデータ整形を行うことができました。心から感謝致します。

    なお、出力のcsvで1列目の最初と3列目(最終列)の最後に”がのこってしまいますが、これは原理上しかたがないのでしょうか。(他の方法で取り除くことはできました)。少しだけ謎が残りました。

    キャンセル

  • 2019/01/12 17:37

    カンマ区切り(CSV)形式出力のデータ内にカンマが含まれている場合はcsv.writer が自動で前後に「"」を付加します。
    たとえば「Green JL, Plotkin J B 」は「"Green JL, Plotkin J B" 」と出力されます。これはcsvモジュールの仕様です。
    そうしないと、読み取り時に「Green JL」と「Plotkin J B 」が別列になってしまいます。

    キャンセル

  • 2019/01/12 20:13

    なるほど!よくわかりました。ありがとうございました。

    キャンセル

+1

rowはリストなので型が合いません

csvでないので単にopenで開くか、このままrowのかわりに",".join(row)として文字列にしてあげればよいのではないかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/12 17:23

    ご指摘ありがとうございます。単にopenでもやってみましたが、最終的にcsvに落とし込むところで、つまづきました。ただ、上のcan110さんの方法で解決できました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10699questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • CSV

    918questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • トップ
  • CSVに関する質問
  • 文献文字列を出版年の正規表現(2019)で切って異なる列に格納したcsvを作りたい。1文ならばできるが、連続処理でエラーが出る