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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

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

Python 3.x

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

Q&A

解決済

2回答

1204閲覧

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

islandbiologist

総合スコア13

CSV

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

Python 3.x

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

0グッド

0クリップ

投稿2019/01/12 00:59

前提・実現したいこと

文献リストを出版年を正規表現として認識して、それを境に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 B2007A 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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Python

1import re 2import csv 3 4r = re.compile(r'((\d\d\d\d))') 5 6with open('example_ref2.csv') as fin: 7 lines = fin.readlines() 8 with open('output.csv', 'w', newline='') as fout: 9 writer = csv.writer(fout) 10 for line in lines: 11 line = r.split(line.rstrip()) 12 writer.writerow(line)

投稿2019/01/12 02:58

can110

総合スコア38260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

islandbiologist

2019/01/12 08:27

簡潔な方法を教えていただきありがとうございます。encoding(encoding=shift_jisで処理)等で少し手こずりましたが、最終的に得たいデータ整形を行うことができました。心から感謝致します。 なお、出力のcsvで1列目の最初と3列目(最終列)の最後に”がのこってしまいますが、これは原理上しかたがないのでしょうか。(他の方法で取り除くことはできました)。少しだけ謎が残りました。
can110

2019/01/12 08:37

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

2019/01/12 11:13

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

0

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

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

投稿2019/01/12 01:09

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

islandbiologist

2019/01/12 08:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問