前提・実現したいこと
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
前回の回答者です。
>回答ありがとうございます.
>これを実行してみたのですが,ファイルAの文字列が全て出力されました
こちらで確認したファイルの内容です。
test.csv
山田 太郎 漢字 1
梅田 東京 花 2
東
test2.csv
山田 太郎 漢字 1
大垣 東京 花 2
実行結果
梅田
東
上記のような結果が求める結果ではないのでしょうか?
投稿2018/11/12 04:57
総合スコア5438
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
総合スコア5438
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/12 04:48
2018/11/12 05:03
退会済みユーザー
2018/11/12 05:29
0
https://wandbox.org/permlink/nw6Z0M2UchKxZtIB
同じ場所のセルの値が同じでないものを出したいのか、同じ値のセルがないものを出したいのかわかりませんでしたが、とりあえず書いたのでさらしておく。
元のコードはセルではなく行を比べてませんか?
投稿2018/11/09 07:31
編集2018/11/09 07:32総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/09 07:39
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
総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/09 07:39
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""" 32あ 33あ 34"""
投稿2018/11/09 05:54
編集2018/11/09 06:36総合スコア38262
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/09 06:08
2018/11/09 06:16
退会済みユーザー
2018/11/09 06:28
2018/11/09 06:32
2018/11/09 06:37
退会済みユーザー
2018/11/09 07:16
2018/11/09 07:17
退会済みユーザー
2018/11/09 07:40
0
第1段階:ファイルAからデータを読み取り、「セル」に分解して表示するスクリプトを書く。
第2段階:それぞれのセルの文字列を所定の文字列(たとえば"俺君僕")と比較して、「含まれていない」場合のみ内容を表示するよう、第1段階で作ったスクリプトを改変する。
第3段階:ファイルBからデータを読み取って適当な変数に格納し、第2段階で作った「所定の文字列」のかわりに利用するよう、スクリプトを改変する。
投稿2018/11/09 05:41
総合スコア13671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/09 05:56
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/12 05:30
2018/11/12 06:34
退会済みユーザー
2018/11/12 06:49
2018/11/12 07:00
退会済みユーザー
2018/11/12 07:02
2018/11/12 07:10
退会済みユーザー
2018/11/12 07:14