0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】csvから読み込んだ文字列が一致しないとき

Last updated at Posted at 2022-12-22

結論

csvを読み込む時,エンコーディングで'utf-8-sig'を指定する.

with open(file,encoding='utf-8-sig') as f:
    csvreader = csv.reader(f)

csvを読み込んだとき先頭に\ufeffがある場合も同じ対処でOK.

発端

csvにある項目を一気にgrep的に検索したかった.
テストで動かしたとき,明らかに一致している文字列があるのに検出してくれなかった.
シェルスクリプトで書く方が楽な人は多いかもね...

search_word.csv
aaa
bbb
ccc
test.txt
aaajfdo
fewapjg
bbbdiaf
search.py
from glob import glob
import csv
import re

target_csv = "search_word.csv"
target_path = "./*" #カレントディレクトリ
pattern = re.compile(r'.cpp|.hpp|.py') #検索したいファイルの拡張子
files = [p for p in glob(target_path, recursive=True)if pattern.search(p) and os.path.isfile(p)] #一応ディレクトリ避けをする

with open(target_csv, encoding='utf8') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
        word = row[0]
        print("word:",word)

        for file in files:
            with open(file, encoding='utf8') as ff:
                data_list = ff.readlines()
                for ind,l in enumerate(data_list):
                    if word in l:
                        print(l)

出力としてはaaabbbでヒットしてくれればいい

出力
word: aaa
word: bbb
bbbdiaf

word: ccc

aaaがヒットしていない.なぜ?おかしいよ.

結局なんだったか

repr(word)でどういう状態なのかみてみる

repr結果
word: aaa
'\ufeffaaa'
word: bbb
'bbb'
word: ccc
'ccc'

aaaの前に変なのがついてる...
検索してみるとBOM(Byte Order Mark)というやつのユニコード表示らしいです.
web系の人にとっては当然の知識なんですかね.

簡単に言うと、「UTF-8 で文字を書いたよ」と PC に知らせるものです。
引用:ウェブ制作:「UTF-8」の「BOM」って何?付けた方がいいの?

BOMがある場合は'utf-8-sig'でエンコード,ない場合は'utf8'でエンコードしてやればいいようです.自動で見分けて読み込む関数作ってる方もいらっしゃいました.
Python Tips: Python で UTF-8 の BOM ありなしを見分けたい

エクセルからCSV UTF-8でエクスポートしたのでBOMがついたのかもしれません.
エクセルのCSVでエクスポートしてやればBOMなしの状態で出てきました.

おわり

search.py
#省略
with open(target_csv, encoding='utf-8-sig') as f:
#省略
出力
word: aaa
aaajfdo

word: bbb
bbbdiaf

word: ccc

はい.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?