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

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

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

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

Python

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

Q&A

解決済

3回答

4740閲覧

Pythonのappendメソッド内でダブルクォーテーションをエスケープできない

fukazume

総合スコア78

CSV

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

Python

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

0グッド

0クリップ

投稿2020/07/17 04:50

編集2020/07/17 05:17

###現象(CSVを出力するPythonプログラムを実行すると...)

python

1 row.append('\'文字列\'') 2 row.append('\"文字列\"')

###CSVとして出力した結果

python

1'文字列',"""文字列""",

###質問
意図した通りのCSVを出力する、シングルクォーテーションをエスケープ処理したappendメソッドの文をそのまま下の行に複製し、ダブルクォーテーションに一部変更してCSV出力すると、上記のようにダブルクォーテーションが3つ連なった形でのCSV出力になってしまいます。

このような挙動になる理由を教えていただけますと大変ありがたく存じます。

期待する出力結果は以下のとおりです。

python

1'文字列',"文字列",

###環境
Windows 10
Python 3.8.3

###追記2020/07/17
以下が現象が再現するpythonプログラムとなります。よろしくお願いいたします。

■再現するプログラム

python

1# -*- coding: utf-8 -*- 2import csv 3 4row = [] 5rows = [] 6source = './test_01.csv' 7 8for i in range(3): 9 row.append('\'文字列\'') 10 row.append('\"文字列\"') 11 row = [] # 行の初期化 12 rows.append(row) 13 14with open(source, 'w', encoding="UTF-8") as f: 15 writer = csv.writer(f, lineterminator='\n') 16 writer.writerows(rows)

■実行結果(CSV出力結果)

csv

1'文字列',"""文字列""" 2'文字列',"""文字列""" 3 4

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

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

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

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

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

can110

2020/07/17 04:57

CSVを出力している部分の(できれば現象が再現するシンプルで実行可能な)コードを提示ください。
quickquip

2020/07/17 05:05 編集

わりと「よくある」CSV実装だと思うのですけれども、それで何か困っていることがあるならその困っていることの方を書くべきです。
fukazume

2020/07/17 05:16

お二方へ、どうもありがとうございます!質問文に再現するPythonコードを追記いたしました。どうぞよろしくお願い申し上げますm(__)m
guest

回答3

0

ベストアンサー

csvモジュールはデフォルトで""で自動でエスケープするので提示のような結果になります。
このモジュールを使う限り、このような自動的な文字列操作が入ってしまいます。
詳細はcsv --- CSV ファイルの読み書きを参照ください。
これを回避するのは大変なので、今回のケースではむしろ使わないほうがよいと思います。

Python

12with open(source, 'w', encoding="UTF-8") as f: 3 for row in rows: 4 f.write( ','.join(row)) 5 f.write('\n')

投稿2020/07/17 05:23

can110

総合スコア38256

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

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

fukazume

2020/07/17 05:43

ご回答ありがとうございます! 「csvモジュールはデフォルトで"を"で自動でエスケープする」、この考え方が自分の中には無く、自分の記述の文法や文字コードばかり疑っていました。頂いたヒントからcsvモジュールのリファレンスを読んでみるとquoting引数なるものを見つけ、試しに適用してみると、いい感じで二重引用符で文字列を括ってくれました。 当面はこの方法を導入できないか模索してみようと思います。ご解説くださり誠にありがとうございました!
guest

0

次の 2 点により、" が 3 重に出力されます

1
Python の標準 CSV モジュールは
クォート文字を含むフィールドはクォートして出力するようになっています
csv --- CSV ファイルの読み書き — Python 3.8.4 ドキュメント

2
Python の標準 CSV モジュールは
" をエスケープするときは、デフォルトでは "" と表記します
csv --- CSV ファイルの読み書き — Python 3.8.4 ドキュメント

投稿2020/07/17 05:15

y_shinoda

総合スコア3272

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

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

fukazume

2020/07/17 05:43

リファレンスのご提示ありがとうございます!
guest

0

can110さんから頂いたアドバイスを基に、quoting引数を追加したところ意図した出力結果となりました。当面はこの方法でどこまでできるか試してみようと思います。皆様、誠にありがとうございました!

####■CSV出力するプログラム

python

1# -*- coding: utf-8 -*- 2import csv 3 4row = [] 5rows = [] 6source = './test_01.csv' 7 8for i in range(3): 9 # row.append('\'文字列\'') 10 # row.append('""文字列""') 11 12 row.append('文字列') 13 row.append('文字列') 14 row = [] 15 rows.append(row) 16 17with open(source, 'w', encoding="UTF-8") as f: 18 writer = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_NONNUMERIC) 19 writer.writerows(rows) ```

####■CSV出力結果

csv

1 2 3 4"文字列","文字列" 5"文字列","文字列" 6 7

投稿2020/07/17 05:52

fukazume

総合スコア78

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問