如何使用其包更新CSV文件

时间:2017-09-09 14:56:09

标签: python csv

这是我的代码:

def update_win():
    #GET EVERY STRING VALUES NEEDED FROM INPUTBAR
    stud_ID = str(ID_num.get())
    stud_name = str(name.get())
    stud_course = str(Crs.get())
    stud_year = str(Yr.get())
    searchID = str(sID_num.get())#ID NUMBER FOR SEARCH
    filename = str(files.get())#FILENAME                
    tempfile = NamedTemporaryFile(mode='w', delete=False)
    fields = ['ID', 'Name', 'Course', 'Year']

    with open(filename, 'r') as csvfile, tempfile:
        reader = csv.DictReader(csvfile, fieldnames=fields)
        writer = csv.DictWriter(tempfile, fieldnames=fields)
        for row in reader:
            if row['ID'] == searchID:
                row['Name'], row['Course'], row['Year'] = stud_name, stud_course, stud_year
                msg = Label(upd_win, text="Update Successful", font="fixedsys 12 bold").place(x=3,y=200)
            row = {'ID': row['ID'], 'Name': row['Name'], 'Course': row['Course'], 'Year': row['Year']}
            writer.writerow(row)

    shutil.move(tempfile.name, filename)

所以这段代码是UPDATE,它从CSV中搜索该ID号,并通过GUI显示其行,因为您可以看到它不是print而是Label,之后它会提示用户要输入新的ID号,新名称,新课程和新年,您要替换为您选择的行。

它确实通过了,但价值并没有改变。任何想法在这里发生了什么以及如何解决它?

2 个答案:

答案 0 :(得分:1)

有时您需要通过编写单独的脚本来测试流程来隔离您的问题。本练习是创建Minimal, Complete, and Verifiable example以在此处发布的第一步。通常,创建一个mcve可以帮助您在发布问题之前找到问题。

这是一个测试读 - 修改 - 写过程是否有效的脚本:

from tempfile import NamedTemporaryFile
import io

s = '''one, two, three
1,2,3
4,5,6
7,8,9
10,11,12
'''

data_csv = io.StringIO(s)
g = NamedTemporaryFile(mode = 'w', delete = False)
fields = ['a', 'b', 'c']

# read-modify-write
with data_csv as f, g:
    w = csv.DictWriter(g, fields)
    w.writeheader()
    r = csv.DictReader(f, fields)
    for line in r:
        line['b'] = 'bar'
        w.writerow(line)

# test - did the modifications get written to a temp file?
with open(g.name) as f:
    print(f.read())

这似乎有效,tempfile中已经修改了数据。

也许 HOW 您修改数据是问题 - 但更改测试脚本以匹配代码的表单也可以正常工作

...
    for line in r:
        line['a'], line['b'], line['c'] = line['a'], 'foo', line['c']
        line = {'a':line['a'], 'b':line['b'], 'c':line['c']}
        w.writerow(line)

假设该函数第一行中的所有.get()都在工作,行中的filename

shutil.move(tempfile.name, filename)

必须没有正确的路径。

OR 条件

if row['ID'] == searchID:

没有工作。

思考的食物:

将代码移动到函数中,比如读 - 修改 - 写部分,不仅有助于提高可读性,还可以使测试更容易。

update_win()使用side effectshutil.move(tempfile.name, filename))而不是返回可以执行操作的内容。副作用会使测试变得更难。

这不一定是坏事(有时候很实际),你只需要知道自己在做这件事。

答案 1 :(得分:0)

您已经打开了'r'读取的两个文件,并且您正在尝试写入临时文件。

您可以将“r +”模式与一个文件句柄一起使用,以便读取和写入文件

...
with open(filename, 'r+') as csvfile:
    reader = csv.DictReader(csvfile, fieldnames=fields)
    writer = csv.DictWriter(csvfile, fieldnames=fields)
    ...