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

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

ただいまの
回答率

88.38%

GUIにて作成した内容をCSV形式にて、保存、読み込みを行いたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 520

fuji36_om

score 8

前提・実現したいこと

作成したプログラムで、No.氏名、性別、生年月日を入力した後、
CSV形式にて保存したい。
CSV形式で保存した内容を読み込む機能を付けたい。
具体的には、各リストの内容を行ごとに保存し、読み込む際は逆にプログラム内の
リストに上書きする方法を取りたいです。

発生している問題・エラーメッセージ

試しに保存してみたが、CSV形式ではなさそう…。
読み込みの関数は、手入力したものを用意して試しましたが、エラーしか起こさなかったので削除しています。

該当のソースコード

#tkinterのインポート
import tkinter as tk
from tkinter import messagebox
from dateutil.parser import parse

# ウィンドウを作成
root = tk.Tk()
root.title("Hello, World!") # タイトル
root.geometry("500x300") # サイズ

b = tk.Label(text="コントロール画面")# 文字の出力
b.pack()


#全Entry消去
def clear():
    txt_No11.delete(0, tk.END)
    txt_No12.delete(0, tk.END)
    txt_No13.delete(0, tk.END)
    txt_No21.delete(0, tk.END)
    txt_No22.delete(0, tk.END)
    txt_No23.delete(0, tk.END)
    txt_No31.delete(0, tk.END)
    txt_No32.delete(0, tk.END)
    txt_No33.delete(0, tk.END)
    txt_No41.delete(0, tk.END)
    txt_No42.delete(0, tk.END)
    txt_No43.delete(0, tk.END)
    txt_No51.delete(0, tk.END)
    txt_No52.delete(0, tk.END)
    txt_No53.delete(0, tk.END)

#手入力で編集された全Entryを一時的に記憶
def Memory(index):
    print( " No11 {}  Len:{}".format(index,len(no)))
    no[index] = txt_No11.get()
    姓[index] = txt_No21.get()
    名[index] = txt_No31.get()
    性別[index] = txt_No41.get()
    生年月日[index] = txt_No51.get()
    index+=1
    print( " No12 {}  Len:{}".format(index,len(no)))
    if( index >= len(no)) : return
    no[index] = txt_No12.get()
    姓[index] = txt_No22.get()
    名[index] = txt_No32.get()
    性別[index] = txt_No42.get()
    生年月日[index] = txt_No52.get()
    index+=1
    print( " No13 {}  Len:{}".format(index,len(no)))
    if( index >= len(no)) : return
    no[index] = txt_No13.get()
    姓[index] = txt_No23.get()
    名[index] = txt_No33.get()    
    性別[index] = txt_No43.get()   
    生年月日[index] = txt_No53.get()

#移動した先のページ内容を全Entryに再表示する  
def hyoji(index):    
    txt_No11.insert(tk.END,no[index])
    txt_No21.insert(tk.END,姓[index])
    txt_No31.insert(tk.END,名[index])
    txt_No41.insert(tk.END,性別[index])
    txt_No51.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No12.insert(tk.END,no[index])
    txt_No22.insert(tk.END,姓[index])
    txt_No32.insert(tk.END,名[index])
    txt_No42.insert(tk.END,性別[index])
    txt_No52.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No13.insert(tk.END,no[index])
    txt_No23.insert(tk.END,姓[index])
    txt_No33.insert(tk.END,名[index])
    txt_No43.insert(tk.END,性別[index])
    txt_No53.insert(tk.END,生年月日[index])


#(各ボタン用関数)
#前ボタン_前ページに移る
def btn_prev():
    global pageid
    Memory(pageid)
    if pageid-3 <0:
        messagebox.showerror('エラー', 'これ以上は前に戻れません')
        print("これ以上は前に戻れません")
        return
    if check_content():     
        return   
    clear()
    pageid-=3
    hyoji(pageid)


#次ボタン_次ページに移る
def btn_next():
    global pageid    
    nextId = pageid+3
    Memory(pageid)
    if check_content():      
        return      
    if(nextId) >= len(no):
        messagebox.showerror('エラー', 'これ以上は先に進めません')
        print("これ以上は先に進めません")        
        return
    clear()
    pageid+=3
    hyoji(pageid)


#クリアボタン_内容を消去
def btn_clear():
    clear()

#チェックボタン_内容をチェック
def check_content():
    global pageid
    s=error_check1(pageid)
    errmsg = error_check2(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check3(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check4(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check5(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg

    if len(s) > 0:
        print("[" + s + "]")
        messagebox.showerror('エラー', s)
        return True
    return False

#noのチェックを行う
def error_check1(index):
    s = ""
    for j in range(3):
        i = index + j
        if(no[i].isdecimal()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「No」に整数を入れてください".format(j+1)
    return s        

#姓のチェックを行う
def error_check2(index):
    s = ""
    for j in range(3):
        i = index + j
        if(姓[i].isalpha()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「姓」に正しく記入してください".format(j+1)
    return s 

def error_check3(index):
    s = ""
    for j in range(3):
        i = index + j
        if(名[i].isalpha()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「名」に正しく記入してください".format(j+1)
    return s       

def error_check4(index):
    s = ""
    for j in range(3):        
        i = index + j
        if(性別[i])  == "男" or (性別[i])  == "女":
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「性別」に男または女で記入してください".format(j+1)
    return s

#生年月日を入力しているか確認するための関数is_date
#error_check5に内蔵
def is_date(string, fuzzy=False):    
    try: 
        parse(string)#parse関数が重要        
        return True

    except ValueError:
        return False

def error_check5(index):
    s = ""
    for j in range(3):
        i = index + j
        if is_date(生年月日[i]) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「生年月日」に正しく記入してください".format(j+1)
    return s   

#保存
def btn_save():
    with open('test.csv', mode='w') as file:
        #for num in range(4):
        file.write(str(no) + "\n")
        file.write(str(姓) + "\n")
        file.write(str(名) + "\n")
        file.write(str(性別) + "\n")
        file.write(str(生年月日) + "\n")      
        Next_button    

# 各種ボタン設定
Prev_button = tk.Button(root,text='前ボタン',command = btn_prev).place(width=50,x=330,y=250)
Next_button = tk.Button(root,text='次ボタン',command = btn_next).place(width=50,x=380,y=250)
Clear_button = tk.Button(root,text='クリア',command = btn_clear).place(width=50,x=25,y=250)
Read_button = tk.Button(root,text='読込').place(width=50,x=130,y=250)
Save_button = tk.Button(root,text='保存',command = btn_save).place(width=50,x=180,y=250)


# テキスト注釈を表示
lbl_1 = tk.Label(text='No.')
lbl_1.place(x=30, y=50)

lbl_2 = tk.Label(text='姓')
lbl_2.place(x=110, y=50)

lbl_3 = tk.Label(text='名')
lbl_3.place(x=220, y=50)

lbl_4 = tk.Label(text='性別')
lbl_4.place(x=330, y=50)

lbl_5 = tk.Label(text='生年月日')
lbl_5.place(x=400, y=50)

# テキストボックス1(No)
txt_No11 = tk.Entry(width=8)
txt_No11.place(x=30, y=80)

txt_No12 = tk.Entry(width=8)
txt_No12.place(x=30, y=110)

txt_No13 = tk.Entry(width=8)
txt_No13.place(x=30, y=140)


# テキストボックス2(姓)
txt_No21 = tk.Entry(width=12)
txt_No21.place(x=110, y=80)

txt_No22 = tk.Entry(width=12)
txt_No22.place(x=110, y=110)

txt_No23 = tk.Entry(width=12)
txt_No23.place(x=110, y=140)


# テキストボックス3(名前)
txt_No31 = tk.Entry(width=12)
txt_No31.place(x=220, y=80)

txt_No32 = tk.Entry(width=12)
txt_No32.place(x=220, y=110)

txt_No33 = tk.Entry(width=12)
txt_No33.place(x=220, y=140)


# テキストボックス4(性別)
txt_No41 = tk.Entry(width=8)
txt_No41.place(x=330, y=80)

txt_No42 = tk.Entry(width=8)
txt_No42.place(x=330, y=110)

txt_No43 = tk.Entry(width=8)
txt_No43.place(x=330, y=140)


# テキストボックス5(生年月日)
txt_No51 = tk.Entry(width=12)
txt_No51.place(x=400, y=80)

txt_No52 = tk.Entry(width=12)
txt_No52.place(x=400, y=110)

txt_No53 = tk.Entry(width=12)
txt_No53.place(x=400, y=140)

no = ["1","に","3","4","5","6","7","8","9","10","11"]
姓 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田"]
名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂"]
性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男"]
生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04",
        "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04"]
pageid = 0
pageid = 0
hyoji(pageid)

root.mainloop( )

試したこと

各種リストを保存してみたが、保存方法が誤っているのはわかるが、どう記述すべきか、
わからない。
読み込みに至っては見当もつかない。

使用法

クリアボタン・・・全エントリー内の内容を消去する
読み込み  ・・・CSV形式で書かれたファイルを読み込み、リストを上書きする予定
保存    ・・・上書きされたリストを読み込み、CSV形式でファイル書く予定
前ボタン、次ボタン  ・・・ページをめくる機能

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

自己解決しました
曲りなりにも動くようになりました。

#tkinterのインポート
import tkinter as tk
from tkinter import messagebox
from dateutil.parser import parse
import pandas as pd
# ウィンドウを作成
root = tk.Tk()
root.title("Hello, World!") # タイトル
root.geometry("500x300") # サイズ

b = tk.Label(text="コントロール画面")# 文字の出力
b.pack()

#全Entry消去
def clear():
    txt_No11.delete(0, tk.END)
    txt_No12.delete(0, tk.END)
    txt_No13.delete(0, tk.END)
    txt_No21.delete(0, tk.END)
    txt_No22.delete(0, tk.END)
    txt_No23.delete(0, tk.END)
    txt_No31.delete(0, tk.END)
    txt_No32.delete(0, tk.END)
    txt_No33.delete(0, tk.END)
    txt_No41.delete(0, tk.END)
    txt_No42.delete(0, tk.END)
    txt_No43.delete(0, tk.END)
    txt_No51.delete(0, tk.END)
    txt_No52.delete(0, tk.END)
    txt_No53.delete(0, tk.END)

#手入力で編集された全Entryを一時的に記憶
def Memory(index):
    print( " No11 {}  Len:{}".format(index,len(no)))
    no[index] = txt_No11.get()
    姓[index] = txt_No21.get()
    名[index] = txt_No31.get()
    性別[index] = txt_No41.get()
    生年月日[index] = txt_No51.get()
    index+=1
    print( " No12 {}  Len:{}".format(index,len(no)))
    if( index >= len(no)) : return
    no[index] = txt_No12.get()
    姓[index] = txt_No22.get()
    名[index] = txt_No32.get()
    性別[index] = txt_No42.get()
    生年月日[index] = txt_No52.get()
    index+=1
    print( " No13 {}  Len:{}".format(index,len(no)))
    if( index >= len(no)) : return
    no[index] = txt_No13.get()
    姓[index] = txt_No23.get()
    名[index] = txt_No33.get()    
    性別[index] = txt_No43.get()   
    生年月日[index] = txt_No53.get()

#移動した先のページ内容を全Entryに再表示する  
def hyoji(index):    
    txt_No11.insert(tk.END,no[index])
    txt_No21.insert(tk.END,姓[index])
    txt_No31.insert(tk.END,名[index])
    txt_No41.insert(tk.END,性別[index])
    txt_No51.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No12.insert(tk.END,no[index])
    txt_No22.insert(tk.END,姓[index])
    txt_No32.insert(tk.END,名[index])
    txt_No42.insert(tk.END,性別[index])
    txt_No52.insert(tk.END,生年月日[index])

    index +=1
    #print('index:', index)#確認用
    if( index >= len(no)) : return
    txt_No13.insert(tk.END,no[index])
    txt_No23.insert(tk.END,姓[index])
    txt_No33.insert(tk.END,名[index])
    txt_No43.insert(tk.END,性別[index])
    txt_No53.insert(tk.END,生年月日[index])


#(各ボタン用関数)
#前ボタン_前ページに移る
def btn_prev():
    global pageid
    Memory(pageid)
    if pageid-3 <0:
        messagebox.showerror('エラー', 'これ以上は前に戻れません')
        print("これ以上は前に戻れません")
        return
    if check_content():     
        return   
    clear()
    pageid-=3
    hyoji(pageid)


#次ボタン_次ページに移る
def btn_next():
    global pageid    
    nextId = pageid+3
    Memory(pageid)
    if check_content():      
        return      
    if(nextId) >= len(no):
        messagebox.showerror('エラー', 'これ以上は先に進めません')
        print("これ以上は先に進めません")        
        return
    clear()
    pageid+=3
    hyoji(pageid)


#クリアボタン_内容を消去
def btn_clear():
    clear()

#チェックボタン_内容をチェック
def check_content():
    global pageid
    s=error_check1(pageid)
    errmsg = error_check2(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check3(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check4(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg
    errmsg = error_check5(pageid)
    if len(errmsg) > 0:
        if len(s) > 0:
            s += "\n"
        s += errmsg

    if len(s) > 0:
        print("[" + s + "]")
        messagebox.showerror('エラー', s)
        return True
    return False

#noのチェックを行う
def error_check1(index):
    s = ""
    for j in range(3):
        i = index + j
        if(no[i].isdecimal()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「No」に整数を入れてください".format(j+1)
    return s        

#姓のチェックを行う
def error_check2(index):
    s = ""
    for j in range(3):
        i = index + j
        if(姓[i].isalpha()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「姓」に正しく記入してください".format(j+1)
    return s 

def error_check3(index):
    s = ""
    for j in range(3):
        i = index + j
        if(名[i].isalpha()) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「名」に正しく記入してください".format(j+1)
    return s       

def error_check4(index):
    s = ""
    for j in range(3):        
        i = index + j
        if(性別[i])  == "男" or (性別[i])  == "女":
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「性別」に男または女で記入してください".format(j+1)
    return s

#生年月日を入力しているか確認するための関数is_date
#error_check5に内蔵
def is_date(string, fuzzy=False):    
    try: 
        parse(string)#parse関数が重要        
        return True

    except ValueError:
        return False

def error_check5(index):
    s = ""
    for j in range(3):
        i = index + j
        if is_date(生年月日[i]) == True:
            pass
        else:
            if len(s) > 0:
                s += "\n"
            s += "{}列目の「生年月日」に正しく記入してください".format(j+1)
    return s   

#保存
def btn_save():
    with open('test.csv', mode='w') as file:
        file.write("no,姓,名,性別,生年月日\n")
        for index in range(len(no)):
            s = no[index] + "," + 姓[index] + "," + \
            名[index] + "," + 性別[index] + "," + 生年月日[index] + "\n"            
            file.write(s)
#読み込み
def btn_read():
    df = pd.read_csv('test2.csv', encoding='shift_jis',header=None)

    no.clear()
    for i in range(12):
        no.append(df.iloc[i, 0])

    姓.clear()
    for i in range(12):
        姓.append(df.iloc[i, 1])

    名.clear()
    for i in range(12):
        名.append(df.iloc[i, 2])

    性別.clear()
    for i in range(12):
        性別.append(df.iloc[i, 3])

    生年月日.clear()
    for i in range(12):
        生年月日.append(df.iloc[i, 4])
    clear()
    index=0
    hyoji(index)
    print(no)
    print(姓)
    print(名)
    print(性別)
    print(生年月日)

# 各種ボタン設定
Prev_button = tk.Button(root,text='前ボタン',command = btn_prev).place(width=50,x=330,y=250)
Next_button = tk.Button(root,text='次ボタン',command = btn_next).place(width=50,x=380,y=250)
Clear_button = tk.Button(root,text='クリア',command = btn_clear).place(width=50,x=25,y=250)
Read_button = tk.Button(root,text='読込',command = btn_read).place(width=50,x=130,y=250)
Save_button = tk.Button(root,text='保存',command = btn_save).place(width=50,x=180,y=250)


# テキスト注釈を表示
lbl_1 = tk.Label(text='No.')
lbl_1.place(x=30, y=50)

lbl_2 = tk.Label(text='姓')
lbl_2.place(x=110, y=50)

lbl_3 = tk.Label(text='名')
lbl_3.place(x=220, y=50)

lbl_4 = tk.Label(text='性別')
lbl_4.place(x=330, y=50)

lbl_5 = tk.Label(text='生年月日')
lbl_5.place(x=400, y=50)

# テキストボックス1(No)
txt_No11 = tk.Entry(width=8)
txt_No11.place(x=30, y=80)

txt_No12 = tk.Entry(width=8)
txt_No12.place(x=30, y=110)

txt_No13 = tk.Entry(width=8)
txt_No13.place(x=30, y=140)


# テキストボックス2(姓)
txt_No21 = tk.Entry(width=12)
txt_No21.place(x=110, y=80)

txt_No22 = tk.Entry(width=12)
txt_No22.place(x=110, y=110)

txt_No23 = tk.Entry(width=12)
txt_No23.place(x=110, y=140)


# テキストボックス3(名前)
txt_No31 = tk.Entry(width=12)
txt_No31.place(x=220, y=80)

txt_No32 = tk.Entry(width=12)
txt_No32.place(x=220, y=110)

txt_No33 = tk.Entry(width=12)
txt_No33.place(x=220, y=140)


# テキストボックス4(性別)
txt_No41 = tk.Entry(width=8)
txt_No41.place(x=330, y=80)

txt_No42 = tk.Entry(width=8)
txt_No42.place(x=330, y=110)

txt_No43 = tk.Entry(width=8)
txt_No43.place(x=330, y=140)


# テキストボックス5(生年月日)
txt_No51 = tk.Entry(width=12)
txt_No51.place(x=400, y=80)

txt_No52 = tk.Entry(width=12)
txt_No52.place(x=400, y=110)

txt_No53 = tk.Entry(width=12)
txt_No53.place(x=400, y=140)

no = ["1","2","3","4","5","6","7","8","9","10","11","12"]
姓 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田","清野"]
名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂","菜緒",]
性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男","女"]
生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04",
        "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04","1992/11/30"]
pageid = 0
pageid = 0
hyoji(pageid)

root.mainloop( )

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

btn_save()が上手く動かないという話で合ってますか?
csvモジュールを使うのが楽です。

import csv
#保存
def btn_save():
    with open('test.csv', mode='w') as file:
        writer = csv.writer(file)
        writer.writerow([str(no)])
        writer.writerow([str(姓)])
        writer.writerow([str(名)])
        writer.writerow([str(性別)])
        writer.writerow([str(生年月日)]) 


一行に納める場合はこちら

import csv
#保存
def btn_save():
    with open('test.csv', mode='w') as file:
        writer = csv.writer(file)
        writer.writerow([str(no),str(姓),str(名),str(性別),str(生年月日)]) 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/02 15:24

    逆の、読み込みをする場合はどうプログラミングすればよいでしょうか、
    今の方法でも、読み書きで悪戦苦闘していますが、
    import csv を用いたやり方では皆目見当つきません。

    キャンセル

  • 2020/09/02 15:45

    読み込みの関数が質問文に見つけれなかったので参考URLを貼っておきます。
    https://note.nkmk.me/python-csv-reader-writer/

    キャンセル

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

  • ただいまの回答率 88.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る