【问题标题】:How to remove a single line of data from one csv and write it to a different csv? [closed]如何从一个csv中删除一行数据并将其写入不同的csv? [关闭]
【发布时间】:2021-01-27 21:17:42
【问题描述】:

我正在尝试让我的确认按钮激活从现有公园中删除公园名称并将其写入已访问公园的新 csv。所以第一次程序需要创建新的 csv 如果它不存在。基本上它会在新的 csv 中记录访问过的公园。这是我尝试过的,但它没有执行(参见def confirm_park())。我有点失落。有什么指示或提示可以帮助我前进吗?

from tkinter import *
from tkinter import messagebox
import pandas
import random
import csv

BACKGROUND_COLOR = "#006600"
BUTTON_COLOR = "#6699ff"


# try:
#   data = pandas.read_csv("data/stl_parks_visited.csv")
# except FileNotFoundError:
#   original_data = pandas.read_csv("data/stl_parks_list.csv")
#   to_learn = original_data.to_dict(orient="records")
# else:
#   to_learn = data.to_dict(orient="records")



def new_park():
    with open("stl_parks_list.csv") as f:
      park = f.readlines()
      chosen_park = random.choice(park)
      canvas.itemconfig(park_text, text = chosen_park)  


def confirm_park():
    park.remove(chosen_park)
    print(len(park))
    data = pandas.DataFrame(park)
    data.to_csv("data/stl_parks_visited.csv", index=False)


# --- UI Setup ---
window = Tk()
window.title("St. Louis Parks at Random")
window.config(padx=20, pady=20, bg=BACKGROUND_COLOR)

canvas = Canvas(width=300, height=100, bg="white")
park_text = canvas.create_text(
            150, 
            65, 
            text='Ready, set,\n"GET PARK"', 
            width=280,
            fill=BACKGROUND_COLOR,
            font=("Ariel", 20, "italic")
            )
canvas.grid(row=1, column=0, columnspan=2, pady=20, sticky="NESW")
# arch_img = PhotoImage(file="gateway-arch-park.png")
# canvas.create_image(226, 159, image=arch_img)
# canvas.config(bg=BACKGROUND_COLOR, highlightthickness=0)
# canvas.grid(row=0, column=0, columnspan=2, sticky='')


# --- Label ---
website_label = Label(text="St. Louis Parks at Random", fg="white", bg=BACKGROUND_COLOR)
website_label.grid(column=1, row=0, columnspan=2)


# --- Buttons ---

# "Get Park" button generates a random park name from the stl_parks_list.csv
get_park_button = Button(text="GET PARK", width=20, bg=BUTTON_COLOR, font=("bold"), command=new_park)
get_park_button.grid(column=0, row=2, columnspan=2, sticky='', pady=20) 

# "Confirm" button cornfirms that you want to visit this park. The park name will then be moved to a new csv of stl_visited_parks.csv and removed from the stl_parks_list.csv.
confirm_button = Button(text="CONFIRM", width=10, bg=BUTTON_COLOR, font=("bold"), command=confirm_park)
confirm_button.grid(column=0, row=3)

# Push the "Skip" button to skip the park and get a different suggestion. Park names remain on the parks list until they are confirmed.
skip_button = Button(text="SKIP", width=10, bg=BUTTON_COLOR, font=("bold"), command=new_park)
skip_button.grid(column=1, row=3)



new_park()


window.mainloop()

【问题讨论】:

  • 在这里提问时,最好提供minimal reproducible example,但不幸的是,您的问题中目前有很多不相关的东西——远远超过重现问题所需的最低限度。

标签: python python-3.x dataframe csv tkinter


【解决方案1】:

尝试在.to_csv() 方法中使用mode='a' 参数并仅在文件不存在时才写入标头:

import os

def confirm_park():
    park.remove(chosen_park)
    print(len(park))
    data = pandas.DataFrame(park)
    file = "data/stl_parks_visited.csv"
    data.to_csv(file, index=False, mode='a', header=os.path.isfile(file))

【讨论】:

    【解决方案2】:

    您的代码中存在一些问题:

    1. parkchosen_parknew_park() 内部的局部变量,所以它们不能在confirm_park() 内部访问。它们需要在new_park() 中声明为全局。

    2. 您应该阅读new_park() 之外的公园列表,然后在函数内随机选择一个公园。

    3. 您没有将chosen_park 保存到stl_parks_visited.csv

    4. park 是一个公园名称列表,每个公园名称中都带有尾随“\n”。使用park = f.read().splitlines() 删除结尾的“\n”。

    根据您的代码,stl_park_list.csv 似乎仅在每一行中包含公园名称。所以使用pandas 将列表park 转换为数据框并将数据框保存到文件是没有必要的。只需使用简单的文件操作将chosen_park 附加到输出文件即可。

    下面修改new_park()confirm_park()

    with open("stl_parks_list.csv") as f:
        park = f.read().splitlines()
    
    def new_park():
        global chosen_park
        chosen_park = random.choice(park)
        canvas.itemconfig(park_text, text=chosen_park)  
    
    
    def confirm_park():
        park.remove(chosen_park)
        print(len(park))
        with open("data/stl_parks_visited.csv", "a") as f:
            print(chosen_park, file=f)
    

    通过上述更改,GET PARK 按钮不再需要。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2022-01-14
      • 2019-09-14
      相关资源
      最近更新 更多