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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

1回答

1186閲覧

oPython,csvファイルにつきまして

Behemoth

総合スコア29

Python 3.x

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

0グッド

0クリップ

投稿2018/07/21 04:36

編集2022/01/12 10:55

こんにちは。いつもお世話になっております。

csvファイル内の検索に関する質問です。

with open('text.csv', 'r') as f: for line in f: if line.startswith(''): print(str(line))

上記のコードは、特定の文字から始まる「行」を抽出します。
ここで、特例の「列」からキーワードを探し、それを含む「行」を抽出する良い方法はありますでしょうか?
たとえば

|列1|列2|列3| |Animal|Country|Food| |Cat|US|Udon| |Dog|UK|Ramen|

このようなcsvファイルがあるとします。

ここで、Foodの中から「Ramen」を検索し、Ramenを含む行、すなわち「Dog UK Ramen」

抽出する、といったプログラムです。

よろしくお願いいたします。

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

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

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

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

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

jun68ykt

2018/07/21 04:44

CSVファイルのデータ行の各項目はスペース区切りなのでしょうか?もしそうだとすると、たとえば、"War and Peace" は3つの項目として認識されてしまい、この行のBook列のデータは "War" ということになってしまいます。なので項目の区切りは、たとえば半角カンマなどでもよいのでしょうか?
Behemoth

2018/07/21 04:46

すみません、捕捉します。ご指摘ありがとうございます。
hayataka2049

2018/07/21 04:52

表現の工夫とかはしなくていいので、コードブロック挿入してcsvをテキストとして貼ってください
Behemoth

2018/07/21 04:52

ただ今修正しました
jun68ykt

2018/07/21 04:56 編集

修正を拝読しました。つまり、CSVというよりは、Markdown 記法で書かれた表のデータ行の中で、ある列に特定のテキストが含まれる行を抽出したいということでしょうかね?
Behemoth

2018/07/21 04:57 編集

左様でございます。ご不便をおかけしました。
hayataka2049

2018/07/21 05:02

Markdown 記法ならcsvではない訳ですが。まだ腑に落ちないので、上で「コードブロック挿入してcsvをテキストとして貼ってください」とコメントした通りに書いてくれませんか
jun68ykt

2018/07/21 05:04 編集

なるほどです。であれば、質問を修正して作成した、その Markdown による表全体をソースコードとみなして、 ``` (バッククオート3連続)でくくってもらえますでしょうか? その表が開始するところと終了した直後に ``` を入れるということです。そうすることで、マークダウンのソースコード自体が質問に反映されると思います。
Behemoth

2018/07/21 05:03

承知しました。ご指摘ありがとうございますm(__)m
jun68ykt

2018/07/21 05:13

修正を確認しました。これはMarkdown記法によるページの中の、ある表の部分でしょうか?だとするとtest.csv という名前で保存するのではなく、 拡張子を md にしてtest.md という名前で保存しMarkdownによるテキストファイルであることを明示したほうが良さそうです。
hayataka2049

2018/07/21 05:17

|列1|列2|列3|は実際のデータにも含まれますか。仮に含まれるとして、最初のスペースは?
jun68ykt

2018/07/21 06:04

マークダウンの表だと、ヘッダ行とデータ行の間に |:-----------:|------------:|:------------:| のような区切りの行が必要と思いますが、それは無いということでよいでしょうか?
Behemoth

2018/07/21 06:04

最初のスペースはタイプミスです。修正しておきます。
Behemoth

2018/07/21 06:06

jun68ykt 様 すみません、先ほどはマークダウンの票と申し上げましたが、csvファイルを意図していました。
jun68ykt

2018/07/21 06:24

なるほどです。処理対象のテキストは、現時点の質問に挙げられているものということでよいかと思いますが、以下、補足です。 CSVというのは "Comma-Separated Values" の略なので、何も指定がなければデリミタ(区切り文字)としては半角カンマであるのが通例です。似たものとしてTSVといえばカンマではなくタブが区切り文字になります。このご質問の場合、「 |(縦棒)を区切り文字とするCSV」と言えば、話は通じなくもないです。ですが、それでも「 |(縦棒)を区切り文字とするCSV」と言われたら、(Markdownと違って)各行の先頭と末尾に | がないものを想像しますね。つまり1行目は、”列1|列2|列3” で、2行目は “Animal|Country|Food” のようにです。
Behemoth

2018/07/21 06:55

ご解説ありがとうございます。大変勉強になりました。
guest

回答1

0

pandasでやると簡単です。ここを参考にしてください。

pandasで特定の文字列を含む行を抽出(完全一致、部分一致) | note.nkmk.me

今回の例で書くとこんな感じです。

text.csv

plain

1Animal,Country,Food,Book 2cat,America,Hamburger,War and Peace 3dog,Japan,Sashimi,I Am A Cat 4Tiger,UK,Ramen,The Setting Sun

python

1import pandas as pd 2 3with open('text.csv', 'r') as f: 4 df = pd.read_csv(f, header=0) 5 print(df[df["Food"] == "Ramen"]) 6 7""" => 8 Animal Country Food Book 92 Tiger UK Ramen The Setting Sun 10"""

追記

フォーマットが違うようなので追記。

python

1with open('text.csv', 'r') as f: 2 df = pd.read_table(f, sep="|", header=1) 3 df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

これで読めます。ただし、方法は他にもあると思います。

投稿2018/07/21 04:55

編集2018/07/21 06:11
hayataka2049

総合スコア30933

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

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

Behemoth

2018/07/21 05:00

ご回答ありがとうございます。 さっそく試してみます。
hayataka2049

2018/07/21 05:11

データのフォーマットが想定と違っていたので、dfに変換するまでの方法が変わります。変換しちゃえば同じ方法でできると思いますが
Behemoth

2018/07/21 06:07

承知いたしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問