[解決!Python]CSVファイルの読み書きまとめ:解決!Python
csvモジュール/NumPy/pandasを使って、CSVファイルを読み書きする方法を1ページにまとめて紹介。
CSVファイルの読み書きまとめ
csvモジュールを使った読み込み(csv.readerオブジェクト/csv.DictReaderクラス)
# csvモジュールを使ってCSVファイルから1行ずつ読み込む
import csv
filename = 'populationdata.csv'
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.reader(f)
for row in csvreader:
print(row)
# 出力結果:
#['年', '地域コード', '地域', '総人口']
#['1920年', '00000', '全国', '55963053']
# …… 省略 ……
#['2010年', '00000', '全国', '128057352']
#['2020年', '00000', '全国', '126226568']
# タブ区切りの文字を読み込む
filename = 'tabdelimiteddata.tsv'
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.reader(f, delimiter='\t')
for row in csvreader:
print(row) # 出力結果は省略
# CSVファイルの内容を1つのリストにまとめる
filename = 'populationdata.csv'
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.reader(f)
content = [row for row in csvreader] # 各年のデータを要素とするリスト
#content = []
#for row in csvreader:
# content.append(row)
print(content)
# 出力結果:
#[['年', '地域コード', '地域', '総人口'], ['1920年', '00000', '全国',
# '55963053'], …… , ['2010年', '00000', '全国', '128057352'], ['2020年',
# '00000', '全国', '126226568']]
# 特定の列のデータ型を変換する
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.reader(f)
header = next(csvreader) # 見出し行は別扱い
content = [[row[0], row[1], row[2], int(row[3])] for row in csvreader]
content.insert(0, header) # 最後にリストの先頭に見出し行を挿入
print(content)
# 出力結果:
#[['年', '地域コード', '地域', '総人口'], ['1920年', '00000', '全国',
# 55963053], …… , ['2010年', '00000', '全国', 128057352], ['2020年',
# '00000', '全国', 126226568]]
# 数値フィールド以外はシングルクオートで囲まれていることを指示して
# 数値フィールドの値を全て浮動小数点数値に自動的に変換
filename = 'sample.csv'
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.reader(f, quotechar="'", quoting=csv.QUOTE_NONNUMERIC)
for row in csvreader:
print(row)
# 出力結果
# ['年', '地域コード', '地域', '総人口']
# ['1920年', '00000', '全国', 55963053.0]
# …… 省略 ……
# ['2010年', '00000', '全国', 128057352.0]
# ['2020年', '00000', '全国', 126226568.0]
# CSVファイルの内容から辞書形式のデータを作成
with open(filename, encoding='utf8', newline='') as f:
csvreader = csv.DictReader(f)
content = [row for row in csvreader]
print(content[0])
# 出力結果:
#{'年': '1920年', '地域コード': '00000', '地域': '全国', '総人口': '55963053'}
上のサンプルコードは以下に示すCSVファイルからの読み込みを行う例である。
年,地域コード,地域,総人口
1920年,00000,全国,55963053
1930年,00000,全国,64450005
1940年,00000,全国,73075071
1950年,00000,全国,84114574
1960年,00000,全国,94301623
1970年,00000,全国,104665171
1980年,00000,全国,117060396
1990年,00000,全国,123611167
2000年,00000,全国,126925843
2010年,00000,全国,128057352
2020年,00000,全国,126226568
csvモジュールを使ったCSVファイルからの読み込みについては「CSVファイルから読み込みを行うには(csvモジュール編)」を参照のこと。
csvモジュールを使った書き込み(csv.writerオブジェクトのwriterow/writerowsメソッド、csv.DictWriterクラス)
import csv
# サンプルデータとテキストファイルの内容を出力する関数の準備
header = ['name', 'age', 'tel']
isshiki = ['一色', 25, 'xxxx-yyyy']
endo = ['遠藤', 45, 'mmmm-nnnnn']
kawasaki = ['かわさき', 80, 'zzzz-aaaa']
mylist = [isshiki, endo, kawasaki]
for row in mylist:
print(row)
# 出力結果:
#['一色', 25, 'xxxx-yyyy']
#['遠藤', 45, 'mmmm-nnnnn']
#['かわさき', 80, 'zzzz-aaaa']
from pathlib import Path
def print_lines():
print(Path('test.csv').read_text())
# csvモジュールを使って1行の内容をCSVファイルに書き込み
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(isshiki)
print_lines() # 一色,25,xxxx-yyyy
# csvモジュールを使って複数行の内容をCSVファイルに書き込み
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(mylist)
print_lines()
# 出力結果:
#一色,25,xxxx-yyyy
#遠藤,45,mmmm-nnnnn
#かわさき,80,zzzz-aaaa
# ヘッダーを行頭に書き込む
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerows(mylist)
print_lines()
# 出力結果:
#name,age,tel
#一色,25,xxxx-yyyy
#遠藤,45,mmmm-nnnnn
#かわさき,80,zzzz-aaaa
# 区切り文字をカンマからタブに変更する
with open('test.tsv', 'w', newline='') as f:
writer = csv.writer(f, delimiter='\t')
writer.writerow(isshiki)
repr(Path('test.tsv').read_text()) # "'一色\\t25\\txxxx-yyyy\\n'"
# 全てのフィールドを引用符で囲む(デフォルトはダブルクオート)
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)
writer.writerow(isshiki)
print_lines() # "一色","25","xxxx-yyyy"
# 数値以外のフィールドをシングルクオートで囲む
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC, quotechar="'")
writer.writerow(isshiki)
print_lines() # '一色',25,'xxxx-yyyy'
# 辞書の要素をCSVファイルに書き込む
mydict_list = [dict(zip(header, row)) for row in mylist]
for items in mydict_list:
print(items)
# 出力結果:
#{'name': '一色', 'age': 25, 'tel': 'xxxx-yyyy'}
#{'name': '遠藤', 'age': 45, 'tel': 'mmmm-nnnnn'}
#{'name': 'かわさき', 'age': 80, 'tel': 'zzzz-aaaa'}
with open('test.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=header)
writer.writeheader()
writer.writerows(mydict_list)
print_lines()
# 出力結果:
#name,age,tel
#一色,25,xxxx-yyyy
#遠藤,45,mmmm-nnnnn
#かわさき,80,zzzz-aaaa
csvモジュールを使ったCSVファイルへの書き込みについては「CSVファイルに書き込みを行うには(csvモジュール編)」を参照のこと。
NumPyを使った読み込み(numpy.loadtxt/np.genfromtxt関数)
import numpy as np
from pathlib import Path
# numpy.loadtxt関数
# 読み込むCSVファイルの内容を確認
filename = 'nptest0.csv'
print(Path(filename).read_text())
#0 1 2 # 数値が空白文字で区切られている
#3 4 5
#6 7 8
# loadtxt関数の基本的な使い方
myarray = np.loadtxt(filename) # デフォルトでは空白文字が区切り文字
print(myarray) # デフォルトでは読み込んだ値は浮動小数点数値となる
#[[0. 1. 2.]
# [3. 4. 5.]
# [6. 7. 8.]]
# データ型を指定
myarray = np.loadtxt(filename, dtype=int) # 全てのフィールドが整数と指定
print(myarray)
#[[0 1 2]
# [3 4 5]
# [6 7 8]]
# 読み込むCSVファイルの内容を確認
filename = 'nptest1.csv'
print(Path(filename).read_text())
#0,1,2 # 数値がカンマで区切られている
#3,4,5
#6,7,8
# 区切り文字を指定
myarray = np.loadtxt(filename, delimiter=',') # 区切り文字としてカンマを指定
print(myarray)
#[[0. 1. 2.]
# [3. 4. 5.]
# [6. 7. 8.]]
myarray = np.loadtxt(filename) # ValueError:デフォルトは空白文字が区切り文字
# 読み込むCSVファイルの内容を確認
filename = 'nptest2.csv'
print(Path(filename).read_text())
#col1 col2 col3 # ヘッダーあり。数値が空白文字で区切られている
#0 1 2
#3 4 5
#6 7 8
# 先頭行を読み飛ばす
myarray = np.loadtxt(filename, skiprows=1) # 先頭の1行を読み飛ばす
print(myarray)
#[[0. 1. 2.]
# [3. 4. 5.]
# [6. 7. 8.]]
# 読み込むCSVファイルの内容を確認
filename = 'nptest3.csv'
with open(filename, encoding='utf8') as f:
print(f.read())
#一色 25 170 # 文字列/数値/数値が空白文字で区切られている
#かわさき 80 168
# 読み込む列を指定する
myarray = np.loadtxt(filename, usecols=[1, 2], encoding='utf8')
print(myarray)
#[[ 25. 170.]
# [ 80. 168.]]
# 列ごとに内容を取り出す(転置)
ages, heights = np.loadtxt(filename, unpack=True, usecols=[1, 2], encoding='utf8')
print(ages) # [25. 80.]
print(heights) # [170. 168.]
# numpy.genfromtxt関数
# 読み込むCSVファイルの内容を確認
filename = 'nptest4.csv'
with open(filename, encoding='utf8') as f:
print(f.read())
#name age height # ヘッダーあり。文字列/数値/数値が空白文字で区切られている
#一色 25 170
#かわさき 80 168
# 基本的な読み込み
myarray = np.genfromtxt(filename, encoding='utf8')
print(myarray)
#[[ nan nan nan] # 数値以外はnanとされている
# [ nan 25. 170.]
# [ nan 80. 168.]]
print(myarray.dtype) # float64
# 各フィールドの値からデータ型を判定
myarray = np.genfromtxt(filename, encoding='utf8', dtype=None)
print(myarray)
#[['name' 'age' 'height']
# ['一色' '25' '170']
# ['かわさき' '80' '168']]
print(myarray.dtype) # <U6(全てが6文字以下の文字列と判定された)
# 1行目をヘッダーとして扱い、各列のデータ型を明示的に指定
myarray = np.genfromtxt(filename, names=True, dtype='U4,f,f', encoding='utf8')
print(myarray) # [('一色', 25., 170.) ('かわさき', 80., 168.)]
print(myarray.dtype) # [('name', '<U4'), ('age', '<f4'), ('height', '<f4')]
# 読み込むCSVファイルの内容を確認
filename = 'nptest5.csv'
with open(filename, encoding='utf8') as f:
print(f.read())
#0,,2 # 各行に欠損している値がある
#,4,5
#6,,8
# 欠損値をnanで埋める
myarray = np.genfromtxt(filename, delimiter=',', encoding='utf8')
print(myarray)
#[[ 0. nan 2.] # 欠損している部分の値はnanになる
# [nan 4. 5.]
# [ 6. nan 8.]]
myarray = np.loadtxt(filename, delimiter=',', encoding='utf8') # ValueError
# 欠損値を埋める値を指定する
myarray = np.genfromtxt(filename, delimiter=',', filling_values=-1, encoding='utf8')
print(myarray)
#[[ 0. -1. 2.]
# [-1. 4. 5.]
# [ 6. -1. 8.]]
NumPyを使ったCSVファイルからの読み込みについては「CSVファイルから読み込みを行うには(NumPy編)」を参照のこと。
NumPyを使った書き込み(numpy.savetxt関数)
import numpy as np
from pathlib import Path
x = np.random.randn(2, 3) # 以下の値は一例
print(x)
#[[-2.45567984 1.33310634 0.59013369]
# [ 0.25731195 0.78458477 -0.64572527]]
# 基本的な使い方
np.savetxt('test.csv', x)
print(Path('test.csv').read_text())
#-2.455679835942072398e+00 1.333106339746787494e+00 5.901336922847821853e-01
#2.573119457585911207e-01 7.845847696453233100e-01 -6.457252711716952032e-01
# 区切り文字を変更する
np.savetxt('test.csv', x, delimiter=',') # 区切り文字をカンマ「,」に
print(Path('test.csv').read_text())
#-2.455679835942072398e+00,1.333106339746787494e+00,5.901336922847821853e-01
#2.573119457585911207e-01,7.845847696453233100e-01,-6.457252711716952032e-01
# 書き出すフォーマットの指定
# 指数表記
np.savetxt('test.csv', x, fmt='%.8e') # 小数点以下の精度を8桁に
print(Path('test.csv').read_text())
#-2.45567984e+00 1.33310634e+00 5.90133692e-01
#2.57311946e-01 7.84584770e-01 -6.45725271e-01
np.savetxt('test.csv', x, fmt='%18.8e') # 最小の出力幅を指定
print(Path('test.csv').read_text())
# -2.45567984e+00 1.33310634e+00 5.90133692e-01
# 2.57311946e-01 7.84584770e-01 -6.45725271e-01
# 浮動小数点数値(指数表記をしない)
np.savetxt('test.csv', x, fmt='%12.8f') # 精度の後に「f」を指定
print(Path('test.csv').read_text())
# -2.45567984 1.33310634 0.59013369
# 0.25731195 0.78458477 -0.64572527
# 左寄せ
np.savetxt('test.csv', x, fmt='%-18.8e') # 「-」で左寄せを指定
print(Path('test.csv').read_text())
#-2.45567984e+00 1.33310634e+00 5.90133692e-01
#2.57311946e-01 7.84584770e-01 -6.45725271e-01
# 符号を常に付加
np.savetxt('test.csv', x, fmt='%+18.8e') # 「+」で符号を常に付加
print(Path('test.csv').read_text())
# -2.45567984e+00 +1.33310634e+00 +5.90133692e-01
# +2.57311946e-01 +7.84584770e-01 -6.45725271e-01
# 0埋め
np.savetxt('test.csv', x, fmt='%018.8e') # 「0」で0埋めを指定
print(Path('test.csv').read_text())
#-0002.45567984e+00 00001.33310634e+00 00005.90133692e-01
#00002.57311946e-01 00007.84584770e-01 -0006.45725271e-01
# 整数値
nums = np.array([[111, 222, 333],
[444, 555, 666]])
np.savetxt('test.csv', nums, fmt='%d')
print(Path('test.csv').read_text())
#111 222 333
#444 555 666
np.savetxt('test.csv', nums, fmt='%.5d') # 0埋め
print(Path('test.csv').read_text())
#00111 00222 00333
#00444 00555 00666
np.savetxt('test.csv', nums, fmt='%6d') # 出力される最小の文字数を指定
print(Path('test.csv').read_text())
# 111 222 333
# 444 555 666
np.savetxt('test.csv', nums, fmt='%6.4d') # 数字の最小文字数を指定
print(Path('test.csv').read_text())
# 0111 0222 0333
# 0444 0555 0666
# 改行文字を変更する
np.savetxt('test.csv', x, newline='\n\n')
print(Path('test.csv').read_text())
#-2.455679835942072398e+00 1.333106339746787494e+00 5.901336922847821853e-01
#
#2.573119457585911207e-01 7.845847696453233100e-01 -6.457252711716952032e-01
#
# ヘッダーを付加する
np.savetxt('test.csv', x, header='col1 col2 col3')
print(Path('test.csv').read_text())
## col1 col2 col3
#-2.455679835942072398e+00 1.333106339746787494e+00 5.901336922847821853e-01
#2.573119457585911207e-01 7.845847696453233100e-01 -6.457252711716952032e-01
# フッターを付加する
np.savetxt('test.csv', x, footer='generated: 2021/08/27')
print(Path('test.csv').read_text())
#-2.455679835942072398e+00 1.333106339746787494e+00 5.901336922847821853e-01
#2.573119457585911207e-01 7.845847696453233100e-01 -6.457252711716952032e-01
## generated: 2021/08/27
NumPyを使ったCSVファイルへの書き込みについては「CSVファイルに書き込みを行うには(NumPy編)」を参照のこと。
pandasを使った読み込み(pandas.read_csv関数)
import pandas as pd
from pathlib import Path
filepath = 'pdtest0.csv'
print(Path(filepath).read_text())
#0.0,1.1,2.2
#3.3,4.4,5.5
#6.6,7.7,8.8
df = pd.read_csv(filepath)
print(df)
# 0.0 1.1 2.2
#0 3.3 4.4 5.5
#1 6.6 7.7 8.8
# ヘッダー行がないことを指定
df = pd.read_csv(filepath, header=None)
print(df)
# 0 1 2
#0 0.0 1.1 2.2
#1 3.3 4.4 5.5
#2 6.6 7.7 8.8
# 列名を指定
names = ['col0', 'col1', 'col2']
df = pd.read_csv(filepath, names=names)
print(df)
# col0 col1 col2
#0 0.0 1.1 2.2
#1 3.3 4.4 5.5
#2 6.6 7.7 8.8
# ヘッダー行がある場合
filepath = 'pdtest1.csv'
print(Path(filepath).read_text())
#col0,col1,col2
#0.0,1.1,2.2
#3.3,4.4,5.5
#6.6,7.7,8.8
df = pd.read_csv(filepath)
print(df)
# col0 col1 col2 # ヘッダー行から列名を推測してくれる
#0 0.0 1.1 2.2
#1 3.3 4.4 5.5
#2 6.6 7.7 8.8
# 列名をヘッダー行から推測せずに、明示的に指定する
names = ['foo', 'bar', 'baz']
df = pd.read_csv(filepath, names=names, header=0)
print(df)
# foo bar baz
#0 0.0 1.1 2.2
#1 3.3 4.4 5.5
#2 6.6 7.7 8.8
# 区切り文字の指定
filepath = 'pdtest2.csv'
print(Path(filepath).read_text())
#col0 col1 col2 # 空白文字で区切っている
#0.0 1.1 2.2
#3.3 4.4 5.5
#6.6 7.7 8.8
df = pd.read_csv(filepath, sep=' ')
print(df)
# col0 col1 col2
#0 0.0 1.1 2.2
#1 3.3 4.4 5.5
#2 6.6 7.7 8.8
# 読み込む列の指定
filepath = 'pdtest1.csv'
df = pd.read_csv(filepath, usecols=[0, 2])
print(df)
# col0 col2
#0 0.0 2.2
#1 3.3 5.5
#2 6.6 8.8
df = pd.read_csv(filepath, usecols=['col0', 'col2'])
print(df) # 出力は省略
df = pd.read_csv(filepath, usecols=lambda x: x in ['col0', 'col2'])
print(df) # 出力は省略
# 行ラベル(インデックス)となる列の指定
filepath = 'pdtest3.csv'
print(Path(filepath).read_text())
#,col1,col2,col3
#row0,0.0,1.1,2.2
#row1,3.3,4.4,5.5
#row2,6.6,7.7,8.8
df = pd.read_csv(filepath, index_col=0)
print(df)
# col1 col2 col3
#IDX
#row0 0.0 1.1 2.2
#row1 3.3 4.4 5.5
#row2 6.6 7.7 8.8
df = pd.read_csv(filepath, index_col='IDX')
print(df) # 出力は省略
# データ型の指定
filepath = 'pdtest4.csv'
print(Path(filepath).read_text())
#area,tel,value
#tokyo,0312345678,1.0
#kanagawa,045678901,2.0
#chiba,043210987,3.0
df = pd.read_csv(filepath)
print(df)
# area tel value # 電話番号が整数値になっている
#0 tokyo 312345678 1.0
#1 kanagawa 45678901 2.0
#2 chiba 43210987 3.0
df = pd.read_csv(filepath, dtype=str) # 全てのデータの型をstrに
print(df)
# area tel value
#0 tokyo 0312345678 1.0
#1 kanagawa 045678901 2.0
#2 chiba 043210987 3.0
df = pd.read_csv(filepath, dtype={0: str, 1: str, 2: float})
print(df) # 出力は省略
# 日付のパース
filepath = 'pdtest5.csv'
print(Path(filepath).read_text())
#date,value0,value1
#2021/09/07,1.0,2.0
#2021/09/08,3.0,4.0
#2021/09/09,5.0,5.0
df = pd.read_csv(filepath, parse_dates=True, index_col=0)
print(df)
# value0 value1
#date
#2021-09-07 1.0 2.0
#2021-09-08 3.0 4.0
#2021-09-09 5.0 5.0
df = pd.read_csv(filepath, parse_dates=[0])
print(df)
# date value0 value1
#0 2021-09-07 1.0 2.0
#1 2021-09-08 3.0 4.0
#2 2021-09-09 5.0 5.0
df = pd.read_csv(filepath, parse_dates=['date'])
print(df) # 出力は省略
filepath = 'pdtest6.csv'
print(Path(filepath).read_text())
#year,month,day,value0,value1
#2021,9,7,1.0,2.0
#2021,9,8,3.0,5.0
#2021,9,9,4.0,6.0
dates = [['year', 'month', 'day']]
df = pd.read_csv(filepath, parse_dates=dates)
print(df)
# year_month_day value0 value1
#0 2021-09-07 1.0 2.0
#1 2021-09-08 3.0 5.0
#2 2021-09-09 4.0 6.0
dates = {'date': ['year', 'month', 'day']}
df = pd.read_csv(filepath, parse_dates=dates)
print(df)
# date value0 value1
#0 2021-09-07 1.0 2.0
#1 2021-09-08 3.0 5.0
#2 2021-09-09 4.0 6.0
# 欠損値の扱い
filepath = 'pdtest7.csv'
print(Path(filepath).read_text())
# col0,col1,col2
# ,nan,1.0
# 2.0,N/A,null
# NaN,3.0,--
df = pd.read_csv(filepath)
print(df)
# col0 col1 col2
#0 NaN NaN 1.0
#1 2.0 NaN NaN
#2 NaN 3.0 -- # 「--」という文字列は欠損値としては扱われていない
df = pd.read_csv(filepath, na_values=['--'])
print(df)
# col0 col1 col2 # デフォルトの欠損値とna_valuesに指定した値が欠損値
#0 NaN NaN 1.0
#1 2.0 NaN NaN
#2 NaN 3.0 NaN
df = pd.read_csv(filepath, keep_default_na=False, na_values=['--'])
print(df)
# col0 col1 col2 # na_valuesに指定した値のみが欠損値として扱われる
#0 nan 1.0
#1 2.0 N/A null
#2 NaN 3.0 NaN
pandasを使ったCSVファイルからの読み込みについては「CSVファイルから読み込みを行うには(pandas編)」を参照のこと。
pandasを使った書き込み(pandas.DataFrame.to_csvメソッド)
import pandas as pd
import numpy as np
from pathlib import Path
data = {
'name': ['isshiki', 'endo', 'kawasaki'],
'age': [20, 25, np.nan],
'weight': [55.44, 66.77, 123.456]
}
df = pd.DataFrame(data)
print(df)
# name age weight
#0 isshiki 20.0 55.440
#1 endo 25.0 66.770
#2 kawasaki NaN 123.456
# 基本
fname = 'test.csv'
df.to_csv(fname)
print(Path(fname).read_text())
#,name,age,weight
#0,isshiki,20.0,55.44
#1,endo,25.0,66.77
#2,kawasaki,,123.456
# 区切り文字の変更
df.to_csv(fname, sep=' ')
print(Path(fname).read_text())
# name age weight
#0 isshiki 20.0 55.44
#1 endo 25.0 66.77
#2 kawasaki 123.456
# 欠損値の表現を指定する
df.to_csv(fname, na_rep='nan')
print(Path(fname).read_text())
#,name,age,weight
#0,isshiki,20.0,55.44
#1,endo,25.0,66.77
#2,kawasaki,nan,123.456
# 数値を文字列化する際の書式指定
df.to_csv(fname, float_format='%+08.3f')
print(Path(fname).read_text())
#,name,age,weight
#0,isshiki,+020.000,+055.440
#1,endo,+025.000,+066.770
#2,kawasaki,,+123.456
# ヘッダー行の指定
df.to_csv(fname, header=['col0', 'col1', 'col2'])
print(Path(fname).read_text())
#,col0,col1,col2
#0,isshiki,20.0,55.44
#1,endo,25.0,66.77
#2,kawasaki,,123.456
# 行インデックスの列名を指定
df.to_csv(fname, index_label='idx')
print(Path(fname).read_text())
#idx,name,age,weight
#0,isshiki,20.0,55.44
#1,endo,25.0,66.77
#2,kawasaki,,123.456
# 行インデックスを出力しない
df.to_csv(fname, index=False)
print(Path(fname).read_text())
#name,age,weight
#isshiki,20.0,55.44
#endo,25.0,66.77
#kawasaki,,123.456
# 書き出す列の指定
df.to_csv(fname, columns=['name', 'weight'])
print(Path(fname).read_text())
#,name,weight
#0,isshiki,55.44
#1,endo,66.77
#2,kawasaki,123.456
# クオートの指定
import csv
df.to_csv(fname, quoting=csv.QUOTE_ALL)
print(Path(fname).read_text())
#"","name","age","weight"
#"0","isshiki","20.0","55.44"
#"1","endo","25.0","66.77"
#"2","kawasaki","","123.456"
df.to_csv(fname, quoting=csv.QUOTE_NONNUMERIC, quotechar="'")
print(Path(fname).read_text())
#'','name','age','weight'
#0,'isshiki',20.0,55.44
#1,'endo',25.0,66.77
#2,'kawasaki','',123.456
# フィールドを囲むのに使う引用符自体がフィールドに含まれている場合の処理
data = {
"name": ["chak'n", "and pop"],
"value": [100, 120]
}
df = pd.DataFrame(data)
print(df)
# name value
#0 chak'n 100
#1 and pop 120
df.to_csv(fname, quoting=csv.QUOTE_NONNUMERIC, quotechar="'")
print(Path(fname).read_text())
#'','name','value'
#0,'chak''n',100
#1,'and pop',120
df.to_csv(fname, sep=' ', quoting=csv.QUOTE_NONE, escapechar='\\')
print(Path(fname).read_text())
# name value
#0 chak'n 100
#1 and\ pop 120
pandasを使ったCSVファイルへの書き込みについては「CSVファイルに書き込みを行うには(pandas編)」を参照のこと。
Copyright© Digital Advantage Corp. All Rights Reserved.