前提・実現したいこと
文献リストを出版年を正規表現として認識して、それを境に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)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
python
1TypeError: expected string or bytes-like object 2#"(row)"の部分
該当のソースコード
python
1import re, csv, os 2csv_rows =[] 3csv_file_obj=open("example_ref2.csv", encoding="UTF-8")#csv読み込み、エンコードの指定 4reader_obj=csv.reader(csv_file_obj) 5ref_year_regex = re.compile(r'((\d\d\d\d))')#")"ではなく\)とすることで、”かっこ”をエスケープした。正規表現(年)を認識 6 7for row in reader_obj: #csvの上の行から順番に読み込んで、分割処理をする 8 ref1_split=ref_year_regex.split(row)#上で作ったregex(compile)を用いて文献を分ける。ここで行ごとの読み込みにエラー 9 csv_rows.append(row) 10csv_file_obj.close() 11 12#csvの書き出し 13csv_file_obj = open("output.csv", 'w', newline='') 14csv_writer =csv.writer(csv_file_obj) 15for row in csv_rows: 16 csv_writer.writerrow(row) 17csv_file_obj.close()
試したこと
ひとまず1行であれば以下のソースコードでやりたいことを実現できる。これを複数行で実現したい。
python
1#正規表現で出版年の文字列を検出する 2import re, csv 3ref1='石原千秋ほか(1992)『読むための理論』世織書房.' 4ref_year_regex = re.compile(r'((\d\d\d\d))')#")"ではなく\)とすることで、”かっこ”をエスケープした 5mo = ref_year_regex.search(ref1)#これでmoに出版年を入れることができた 6print(mo.group()) 7#output=(1992) 8 9#検出した出版年で文献データを3つに分割し、リストを作る 10ref1_split=ref_year_regex.split(ref1)#上で作ったregex(compile)を用いて文献を分けることができた。 11ref1_split 12#output=['石原千秋ほか', '(1992)', '『読むための理論』世織書房.'] 13 14#csvへの書き込み 15output_file=open('output3.csv', 'w', newline='') 16output_writer = csv.writer(output_file) 17output_writer.writerow(ref1_split) 18output_file.close() 19 20#これでひとまず上のリストをcsvに書き込むことができる。これを複数行に対して繰り返すことができれば。 21
補足情報(FW/ツールのバージョンなど)
jupyter notebook使用
python3.6.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/12 08:27
2019/01/12 08:37
2019/01/12 11:13