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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

6回答

3533閲覧

Pythonで2つのcsvファイルを比較し,一致するセルを抽出する方法

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/11/09 04:53

前提・実現したいこと

Pythonで2つのcsvファイルを比較して,一致しないセルを抽出する方法が分かりません.
1つのcsvファイルAに「僕」という文字のあるセルがあると仮定して,もう1つのcsvファイルBに「僕」という文字がないセルがあった時にファイルAの「僕」という文字を抽出したいです.

以下が試してみたコードですが,うまくいかなかったのでご教授願いたいです.

該当のソースコード

Python

1for row2 in csv.reader(open('test2.csv','r'),delimiter = '\t'): 2 for row1 in csv.reader(open('test.csv','r'),delimiter = '\t'): 3 if( row2 != row1): 4 print(row1)

試したこと

解決方法を調べたのですが,良い方法が見つかりませんでした.

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

Python3.7.1

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

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

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

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

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

guest

回答6

0

ベストアンサー

前回の回答者です。
>回答ありがとうございます.
>これを実行してみたのですが,ファイルAの文字列が全て出力されました
こちらで確認したファイルの内容です。
test.csv
山田 太郎 漢字 1
梅田 東京 花 2

test2.csv
山田 太郎 漢字 1
大垣 東京 花 2

実行結果
梅田

上記のような結果が求める結果ではないのでしょうか?

投稿2018/11/12 04:57

tatsu99

総合スコア5438

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

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

退会済みユーザー

退会済みユーザー

2018/11/12 05:30

はい,このような結果を求めています.
tatsu99

2018/11/12 06:34

実際に実行した結果がそのようになっています。 念のため確認ですが、各項目はタブで区切られている前提で間違いないでしょうか。 test.csvの1行目は 山田<tab>太郎<tab>漢字<tab>1<改行> になっている前提です。<tab>は1文字のタブ(\t)で、<改行>は改行文字です。 僕<tab>は<tab>小学生<tab>です<改行>になっていますか。 提示例をみると 僕□は□小学生□です のように見えます。□は1つの全角の空白です。
退会済みユーザー

退会済みユーザー

2018/11/12 06:49

<tab>で違うセルに移るのですがそれでタブで区切られていることになっていますかね?
tatsu99

2018/11/12 07:00

判りません。エディタで作成したのか、excelで作成したのかもわからないので、回答できません。 windows前提になりますが そのファイルをタブがタブとして明確に表示できるエディタ(秀丸、サクラエディタ等)でそのCSVファイルを表示して内容を確認してください。(メモ帳ではタブと空白の区別がつきません)
退会済みユーザー

退会済みユーザー

2018/11/12 07:02

すみません,プログラム上でファイルを生成するのですが,その時にカンマ区切りで保存されていたことが分かりました
tatsu99

2018/11/12 07:10

では、データは、 山田,太郎,漢字,1 のようになっているということで間違いないでしょうか。 そうであれば、デリミタの指定を reader = csv.reader(fileB,delimiter=',') reader = csv.reader(fileA,delimiter=',') に変えてください。
退会済みユーザー

退会済みユーザー

2018/11/12 07:14

ありがとうございます! 望んでいたような結果になりました. 何から何まで教えていただき大変ご迷惑をおかけしました.ありがとうございました.
guest

0

1つのcsvファイルA(test.csv)に「僕」という文字のあるセルがあると仮定して,もう1つのcsvファイルB(test2.csv)に「僕」という文字がないセルがあった時にファイルAの「僕」という文字を抽出します。
各セルはタブで区切られている前提です。

Python3

1import csv 2dictB = {} 3with open('test2.csv') as fileB: 4 reader = csv.reader(fileB,delimiter='\t') 5 for row in reader: 6 for sel in row: 7 dictB[sel] = True 8with open('test.csv') as fileA: 9 reader = csv.reader(fileA,delimiter='\t') 10 for row in reader: 11 for sel in row: 12 if sel not in dictB: 13 print(sel) 14

投稿2018/11/09 14:18

tatsu99

総合スコア5438

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

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

退会済みユーザー

退会済みユーザー

2018/11/12 04:45

回答ありがとうございます. これを実行してみたのですが,ファイルAの文字列が全て出力されました testとtest2を逆にして実行したら一致する文字列のみが出力されました
退会済みユーザー

退会済みユーザー

2018/11/12 04:48

と思ったのですが,testとtest2を逆にして実行してみたところファイルBの文字列のみが全て出力されました...
tatsu99

2018/11/12 05:03

何か、あなたが期待するものと、こちらでの解釈に齟齬があるのかも知れません。あなたがテストされたtest.csvとtest2.csvの内容、及び期待する結果を提示していただければ幸いです。
退会済みユーザー

退会済みユーザー

2018/11/12 05:29

test.csv 僕 は 小学生 です test2.csv 僕 は 小学生 だよ という場合”です”が出力されてほしいです
guest

0

https://wandbox.org/permlink/nw6Z0M2UchKxZtIB

同じ場所のセルの値が同じでないものを出したいのか、同じ値のセルがないものを出したいのかわかりませんでしたが、とりあえず書いたのでさらしておく。

元のコードはセルではなく行を比べてませんか?

投稿2018/11/09 07:31

編集2018/11/09 07:32
mkgrei

総合スコア8560

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

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

退会済みユーザー

退会済みユーザー

2018/11/09 07:39

同じ値のセルがないものを出したかったです.分かり辛くて申し訳ございません. 回答ありがとうございます. 実行してみたのですが,’人間’という値を出した時に{'人','間'}という風になるのですがこれを{'人間'}と出力するにはどうしたらよいのでしょうか?
guest

0

外部ライブラリを使ってよいのであれば、
pandasでこんな感じで書けます。

test.csv

csv

1a,b,c 2d,e,f 3g,h,i

tset2.csv

csv

1a,b,c 2d,x,f 3g,h,i

test.py

Python

1import pandas as pd 2df1 = pd.read_csv('test.csv', header=None) 3df2 = pd.read_csv('test2.csv', header=None) 4res = df1.where(df1.ne(df2)).values 5#[[nan nan nan] 6# [nan 'e' nan] 7# [nan nan nan]] 8 9# 文字列以外を消す 10res2 = [d for d in res.reshape(-1) if isinstance(d, str)] 11#['e']

投稿2018/11/09 06:35

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/11/09 07:39

回答ありがとうございます.試してみます.
guest

0

1ファイル内で複数の同じセル値を1つとして扱ってよいなら集合演算すると楽です。

Python

1# 指定TSVファイルから全セルを集合として読込 2# 複数の同じセル値は1つにまとまることに注意 3import csv 4def read_set(path): 5 st = set() 6 with open( path,'r') as f: 7 r = csv.reader(f,delimiter='\t') 8 for line in r: 9 for cell in line: 10 st.add(cell) 11 return st 12 13#s1 = read_set('test1.csv') 14#s2 = read_set('test2.csv') 15 16# 読み込んだテストデータ 17s1 = set(['あ','い','う','え']) 18s2 = set(['い','う','え','お']) 19 20# 並び順は順不同になる 21print((s1|s2)-(s1&s2)) # {'お', 'あ'} 互いに存在しない要素の和集合 22print(s1-s2) # {'あ'} s2に存在しないs1要素の集合 23 24# 複数の同じセルを1つにまとめたくない場合 25l1 = ['あ','い','う','え','あ'] # リストで保持。読込コードは省略 26s2 = set(['い','う','え','お']) # こちら側は集合でよい 27 28for c in l1: 29 if not c in s2: 30 print(c) 31""" 323334"""

投稿2018/11/09 05:54

編集2018/11/09 06:36
can110

総合スコア38262

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

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

退会済みユーザー

退会済みユーザー

2018/11/09 06:08

ありがとうございます. s1とs2を比較して,一致しないs1のセル(上記のコードの場合だと'あ')を表示したいという趣旨の質問でした.分かり辛くて申し訳ございません. s1とs2を比較して,一致しないs1のセル(上記のコードの場合だと'あ')を表示したい場合はどうしたらよいか伺ってもよろしいでしょうか?よろしくお願いいたします.
can110

2018/11/09 06:16

回答修正しました。 目的の集合演算を考えるにはベン図を描くと理解しやすいです。
退会済みユーザー

退会済みユーザー

2018/11/09 06:28

ありがとうございます.何度も申し訳ないのですが,複数の同じセル値を1つとして扱ってはいけない場合は集合演算を考える方法では難しいのですか?
can110

2018/11/09 06:32

はい。その場合はお手軽な集合演算は使えません。 少なくともtest1側セル値はリストで保持してループを回してtest2側に存在するかどうかチェックする必要があります。
can110

2018/11/09 06:37

複数の同じセル値を1つとして扱ってはいけない場合のコードを追記しました。
退会済みユーザー

退会済みユーザー

2018/11/09 07:16

test1.csvをリストとして読み込むという認識で合っていますか?
can110

2018/11/09 07:17

はい。あってます。
退会済みユーザー

退会済みユーザー

2018/11/09 07:40

ありがとうございます.can110様の回答を参考に試してみます.
guest

0

第1段階:ファイルAからデータを読み取り、「セル」に分解して表示するスクリプトを書く。
第2段階:それぞれのセルの文字列を所定の文字列(たとえば"俺君僕")と比較して、「含まれていない」場合のみ内容を表示するよう、第1段階で作ったスクリプトを改変する。
第3段階:ファイルBからデータを読み取って適当な変数に格納し、第2段階で作った「所定の文字列」のかわりに利用するよう、スクリプトを改変する。

投稿2018/11/09 05:41

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2018/11/09 05:56

ありがとうございます. 段階に分けて実践してみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問