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

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

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

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

1948閲覧

Pythonでエスケープ文字?を文字列化したい

naonobu

総合スコア10

CSV

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/07/11 06:43

編集2021/07/11 06:47

お世話になります。
いまGoogleのコラボラトリーを使い、PythonでCSVで記録されている株価データを整形したいと思っています。

この整形で、CSVのカラムの部分に「""」で囲まれた形の「"日付"」や「"始値"」をつけたいと思っているのですが、
以下の
「 column=["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 」
だと、ただの「日付」や「始値」で整形されてしまいます。
また、RAW文字列などで「"」を文字列として扱うなどを見ているのですが、なぜか「"""日付"""」のように
いくつも”がついてしまい、うまくいきません。
うまく「"日付"」などとCSVに保存される書き方を教えていただけるとありがたいです。
また、なぜ「"""日付”””」などとなってしまうのか、もし分かれば教えて頂きたいです。
よろしくお願いいたします。

Python

1 2import os 3import glob 4import pandas as pd 5 6files = glob.glob("/content/drive/MyDrive/dd/*")#フォルダからcsvファイルのパス付き名をすべて抜き出す。 7 8for file in files:#すべてのファイルに以下を繰り返し実行 9 df=pd.read_csv(file) 10 df.insert(5, "","")#4列目に空の列を挿入 11 12 column=["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 13 df.columns=column 14 fname=os.path.basename(file)#パスを除いた拡張子付きのファイル名のみを抽出 15 df.to_csv("/content/drive/MyDrive/処理済み株価/"+fname,index=False, encoding='utf_8_sig') 16

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

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

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

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

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

guest

回答3

0

ベストアンサー

何を求めているかによりますが、以下の方法での結果が求めるものに近いかもしれません。

python

1import csv 2 3for file in files:#すべてのファイルに以下を繰り返し実行 4 df=pd.read_csv(file) 5 df.insert(5, "","")#4列目に空の列を挿入 6 7 column=["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 8 df.columns=column 9 fname=os.path.basename(file)#パスを除いた拡張子付きのファイル名のみを抽出 10 with open("/content/drive/MyDrive/処理済み株価/"+fname, "w", encoding='utf_8_sig') as f: 11 writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 12 writer.writerows(df.T.reset_index().T.values.tolist())

カラムだけに""を付けることはできるでしょうか?

たぶん、以下で出来ます。

python

1import csv 2 3for file in files:#すべてのファイルに以下を繰り返し実行 4 df=pd.read_csv(file) 5 df.insert(5, "","")#4列目に空の列を挿入 6 7 column=["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 8 df.columns=column 9 fname=os.path.basename(file)#パスを除いた拡張子付きのファイル名のみを抽出 10 with open("/content/drive/MyDrive/処理済み株価/"+fname, "w", encoding='utf_8_sig') as f: 11 writer_q = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 12 writer_q.writerow(column) 13 writer = csv.writer(f) 14 writer.writerows(df.values.tolist())

ダメな場合は、以下を試してみてください。

python

1import csv 2 3for file in files:#すべてのファイルに以下を繰り返し実行 4 df=pd.read_csv(file) 5 df.insert(5, "","")#4列目に空の列を挿入 6 7 column=["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 8 df.columns=column 9 fname=os.path.basename(file)#パスを除いた拡張子付きのファイル名のみを抽出 10 with open("/content/drive/MyDrive/処理済み株価/"+fname, "w", encoding='utf_8_sig') as f: 11 writer_q = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 12 writer_q.writerow(column) 13 with open("/content/drive/MyDrive/処理済み株価/"+fname, "a", encoding='utf_8_sig') as f: 14 writer = csv.writer(f) 15 writer.writerows(df.values.tolist())

投稿2021/07/11 07:26

編集2021/07/11 08:38
ppaul

総合スコア24668

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

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

naonobu

2021/07/11 07:51

ありがとうございます^^ ご提案頂いたプログラムを適用してみたところ、カラム以外の部分で""囲いになっていました。 "日付","始値","高値","安値","終値","前日比","出来高","売残","買残" "2001/02/26",2990.0,3090.0,2800.0,3090.0,"",573,nan,nan "2001/02/27",3140.0,3160.0,2770.0,2870.0,"",168,nan,nan "2001/02/28",2710.0,2920.0,2710.0,2800.0,"",74,nan,nan 目的としては、銘柄は異なりますが、以下のようなCSVを 2009/05/15 869 882 869 882 8840 2009/05/18 872 872 857 860 3830 2009/05/19 885 885 876 876 1140 2009/05/20 889 890 881 886 1390 2009/05/21 882 882 873 878 1550          ↓          ↓ "日付","始値","高値","安値","終値","前日比","出来高","売残","買残" 2002/03/29,830,841,813,815,,202100,, 2002/04/01,822,822,793,793,,13400,, 2002/04/02,813,817,813,815,,19600,, 2002/04/03,811,836,811,832,,14800,, 2002/04/04,836,836,830,831,,14400,, 2002/04/05,830,830,825,825,,10200,, このようにしたいのです。 カラムだけに""を付けることはできるでしょうか?
ppaul

2021/07/11 14:33

回答に追加しましたので、それをお読みください。
guest

0

pandas.DataFrame.to_csv -- quoting
csv.QUOTE_NONNUMERIC

が参考になると思います。

python

1import pandas as pd 2data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28, 34, 29, 42]} 3df = pd.DataFrame(data) 4 5import csv 6df.to_csv('name.csv',quotechar='\"',quoting=csv.QUOTE_NONNUMERIC) 7 8""" 9!cat name.csv 10 11"","Name","Age" 120,"Tom",28 131,"Jack",34 142,"Steve",29 153,"Ricky",42 16 17"""

また"""日付"""になる件について、"(外側の囲いとしてのダブルクオート)""(エスケープ処理されたダブルクオート文字)になっているからだと思います。

参考: csv.Dialect.doublequote

投稿2021/07/11 07:02

toshikawa

総合スコア388

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

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

naonobu

2021/07/11 12:51

ありがとうございます^^ """日付"""になる理由がなんとなくわかりました(^^) でも、まだちゃんとは理解できていません。少し時間かかりますが、時間をかけて噛み砕いていきたいとおもいます^^
guest

0

ダブルクォート"を含む文字列はシングルクォート'で囲めば良いです。

Python

1column=['"日付"','"始値"','"高値"','"安値"','"終値"','"前日比"','"出来高"','"売残"','"買残"']

CSVファイルで"""日付"""となっているなら、それで合っています。
両端の"で文字列がクォートされていて、その中に文字として"が含まれる場合は""と表されるからです。


#追記

コメントを受けての、おそらくこういうことであろうというコードを示します。
動作は確認していません。

Python

1 // 出力ファイルのパス名 2 fout = "/content/drive/MyDrive/処理済み株価/"+os.path.basename(file) 3 4 // 出力ファイルにヘッダ行を出力 5 column = ["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] 6 df = pd.DataFrame(index=[], columns=column) 7 df.to_csv(fout, header=True, index=False, encoding='utf_8_sig', quoting=csv.QUOTE_ALL) 8 9 // データを読み込んで出力ファイルに追加 10 df = pd.read_csv(file) 11 df.insert(5, "","")#4列目に空の列を挿入 12 df.to_csv(fout, mode='a', header=False, index=False, encoding='utf_8_sig', 13 quoting=csv.QUOTE_NONE)

投稿2021/07/11 06:48

編集2021/07/11 13:38
itagagaki

総合スコア8402

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

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

naonobu

2021/07/11 08:41

ありがとうございます^^ 提案頂いた部分を貼り付けて実行したところ、たしかにエクセルで見た場合、"日付"や"始値"のように記録されていました。ただ、これをテキストファイルで開いた場合は """日付""","""始値""","""高値""","""安値""","""終値""","""前日比""","""出来高""","""売残""","""買残""" 2001/03/01,2374.5,2499.5,2093.3,2287.0,,1074,, 2001/03/02,2255.8,2405.7,2237.0,2287.0,,190,,1.0 2001/03/05,2255.7,2255.7,1974.5,2062.0,,108,,1.0 のように"""で囲まれた状態になっていました。 テキストとしてメモ帳などで開いた場合でも"日付"としたいのですが、何か方法がありますでしょうか?
itagagaki

2021/07/11 08:46

それは説明したとおりCSVとして正しい形式のデータになっているわけですが… 「テキストファイルで開いた場合」とはどういう場合のことですか? テキストエディタで開いた場合? 目的を詳しく教えてください。
naonobu

2021/07/11 12:49

説明がいろいろ不足してしまい、ごめんなさい。 今回のデータ整形は、株式投資の分析ソフトに入れ込むための作業なのですが、「ヘッダーが間違っています」というエラーメッセージが出ます。そのヘッダー部分が上記の「"日付" "始値"・・・」なのですが、そのソフトから吐き出した株価データをwindowsでいうメモ帳ソフトで開くと「"日付"・・・」という形式で保存されていて、エクセルで開くと、ただの「日付」となっています。
itagagaki

2021/07/11 13:38 編集

やりたいことがわかりました。 // 出力ファイルのパス名 fout = "/content/drive/MyDrive/処理済み株価/"+os.path.basename(file) // 出力ファイルにヘッダ行を出力 column = ["日付","始値","高値","安値","終値","前日比","出来高","売残","買残"] df = pd.DataFrame(index=[], columns=column) df.to_csv(fout, header=True, index=False, encoding='utf_8_sig', quoting=csv.QUOTE_ALL) // データを読み込んで出力ファイルに追加 df = pd.read_csv(file) df.insert(5, "","")#4列目に空の列を挿入 df.to_csv(fout, mode='a', header=False, index=False, encoding='utf_8_sig', quoting=csv.QUOTE_NONE) これでどうでしょう。 回答にも追記しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問