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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

1回答

1910閲覧

Pythonで文字化けしているCSVファイルの文字コード変換が上手くいかない

M.hosokawa

総合スコア19

CSV

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

0クリップ

投稿2022/06/23 15:29

実現したいこと

CSVファイルを文字化けすることなく、必要分だけ結合したい

起きている現象

アメリカのwebサイトからダウンロードしたCSVファイル(そもそも日本語が文字化けしている)の読み込み、ファイル結合する時に文字コードの変換が上手くいっておりません。
ファイル結合前と後で文字化けしている日本語が変換されているため、エンコード自体は行われていると思うのですが、完全には直っていない状態です。

試したこと

python 文字コード 変換 CSVで調べて出てくる記事で試されていることを一通りやってみたのですが、
どれも結果は変わりませんでした。

また、こちらの記事で文字コードの正規化を行う必要もあるかもしれないということで、こちらも試したのですが結果は変わりませんでした。

特にエラーは出ないのですが文字コードの変換だけが上手くいっておらず、正直なところどこに原因があるのかわかりません。
そもそもCSVファイルが文字化けしている所から始まっているため、そのファイルが原因の可能性もあるかと思うのですが、対処方法がわかりません。

お聞きしたいこと

このような現象が起きている原因は何なのでしょうか?
ファイルに問題ありなのか、コードに問題があるのか、それともまた別の問題か、ご教示いただけますと幸いです。

python

1#実装コード 2#必要なモジュールをインポート 3import glob 4import pandas as pd 5import codecs as cd 6import chardet 7import unicodedata 8from pathlib import Path 9 10#UTF-8、Shift-JISディレクトリへのパス 11path_u = Path("C:\\test\\UTF-8") 12path_s= Path("C:\\test\\Shift-JIS") 13 14#それぞれのディレクトリで「.csv」が入っている名前のファイルを取得 15ufiles = list (path_u.glob("*.csv")) 16sfiles = list (path_s.glob("*.csv")) 17 18#UTF-8とShift-JISフォルダの同名ファイルを辞書形式のペアデータとする 19files_dict = dict(zip(ufiles,sfiles)) 20 21#UTF-8ディレクトリ内のCSVファイルの中身をShift-JISディレクトリ内の同名ファイルに書き込み変換。 22#複数ファイルにも対応するようにfor文で書く。cp932=Shift-JIS。replaceはエラーとなった文字を?に置き換え。 23for ufile,sfile in files_dict.items():#.items()は辞書形式のデータでfor文をまわす際によく利用します。 24 with open(ufile, encoding='utf-8',errors='replace') as fin: 25 with open(sfile, 'w', encoding='utf-8',errors='replace') as fout: 26 fout.write(fin.read()) 27 28# 読み込んだファイルを入れるリストを準備 29lists = [] 30 31# フォルダ、ファイルの種類を指定 32folder = 'C:\\test1\\*.csv' 33 34# #結合後のExcelファイル名を指定 35excel_file_name='C:\\test1\\merge.csv' 36 37#1 フォルダ内のファイル一覧を読み込み 38file_list=glob.glob(folder) 39 40 #2 リストにファイルを保存 41for i in file_list: 42 with cd.open(i, "r", "utf-8", errors='replace') as file: 43 lists.append(pd.read_csv(file, encoding='utf-8')) 44 45#3 リスト内のExcelをマージ 46merge_data = pd.concat(lists) 47 48#4 マージしたデータをExcelへ書き込み 49merge_data.to_csv(excel_file_name,index=0)

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

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

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

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

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

meg_

2022/06/23 15:54

> アメリカのwebサイトからダウンロードしたCSVファイル そのファイルの文字コードが分からないということでしょうか?
otn

2022/06/23 17:32

掲載されているプログラムだと、エンコーディング変換をせずにコピーしているだけですが、プログラムのコピペミスでしょうか?
otn

2022/06/23 17:33 編集

> ファイルに問題ありなのか、コードに問題があるのか、 ファイルのエンコーディングに合わせたプログラムになっていないと言うことでしょうとしか言い様がないです。
jbpb0

2022/06/23 22:36

もし差し支えなければ、 > アメリカのwebサイトからダウンロードしたCSVファイル をダウンロードする方法を教えてください
quickquip

2022/06/23 23:50

> そもそも日本語が文字化けしている 文字化けと認識しているということは、正しい内容が分かっているということになりますか。 現状が「この様な文字が入っているはずだと知っている」だけなのか「ある手順で作業して正しい内容だと確認できている」のかで話が全然違います。(もちろん回答するべき内容も) 「日本語が文字化けしている」と認識した経緯が書かれていない限り、コードが正しいことをやっているのかを第三者に判定することはてきません。
TakaiY

2022/06/24 01:31

そもそも根本的な問題として、まずは入手したCSVファイルを、複数の文字コードに対応している(最近のものなら大抵OK)テキストエディタで開き、そのCSVファイルの日本語文字コードを調べるべきでしょう。 そのCSVファイルの文字コードは何ですか?
guest

回答1

0

まず、複雑なことをやって最終的にうまく行っていない時は、最終的な成果物を得ようとするのではなく、途中を細かくチェックすることです。
VSCodeなどのIDEが使えるならbreadさせて値を見るとか、print文で画面に表示してみるとか、プログラムを細かく分けてそれぞれが想定通りの動きをしているかチェックするとか。
文字コード周りが問題かと考えているときに、forループを回したりpd.concat()を実行したりする必要はありませんよね?
「文字コードの変換」も、要素としては2つに分かれます。
まず、エンコードされたデータをデコードしながらreadしてファイルに書かれているデータを取得すること。
次に、取得したデータを、エンコードしながらwriteしてファイル化すること。
readのチェックなら、例えば以下のようなテストコードを書いてチェックすることをお勧めします。
(test.csvは実際にあるファイル名に置き換えてください)

python

1print('readのテスト') 2with open('test.csv', encoding='utf-8',errors='replace') as fin: 3 read_data = fin.read() 4 print(read_data)

コードの問題点の指摘です。
前半部分、utf8のファイルを読んで、shift-jisでwriteすることを意図していると思いますが、writeする際のencodingの指定が'utf-8'になっています。
encoding='shift_jisとするべきだろうと思います。
本質からは逸れますが、ご提示のコードはpath_sにpath_uと同じ名前のファイル群があらかじめ格納されていることを前提としていて、同名ファイルを上書きしようとしていますが、やりたいことはpath_uのファイルを読んで、同名のファイル名でpath_sに書き出すことですよね?
path_sは空の状態で始めるのが普通だと思います。
後半部分、codecsでopenしてからpandasでread_csv()していますね。
これでも動きそうですが、pandasは

python

1data_frame = pd.read_csv(file_path, encoding='utf-8')

だけで動きますので、codecsは不要です。
コメントに「Excelへ書き込み」とありますが、出力しているのはあくまでcsvファイルであってExcelファイルではありません。
Excelはcsvファイルをダブルクリックして開くと、encodingの解釈に失敗してutf-8のファイルでもshift-jisのファイルとして開こうとするのでご注意ください。
csvファイルが正しくwriteできたか確認する際は、Excelではなくテキストエディタ(秀丸とかサクラエディタ、VSCodeでも可)で開いてみることをお勧めします。
テキストエディタならExcelと違ってエンコードの解釈をうまくやってくれることが多いですし、文字化けしていたら「エンコードの種類を指定して開きなおす」ことが容易にできます。
Excelで確認したいなら、ダブルクリックで開くのではなくデータタブの「テキストまたはCSVから」を使ってテキストデータをインポートする必要がありますので、ご注意ください。

投稿2022/06/23 22:05

turkey1212

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問