替换CSV文件中用户输入的字符串(重写文件)

时间:2020-08-17 22:36:16

标签: python python-3.x loops csv shutil

我正在尝试创建一个函数,该函数允许用户输入一个文件名,一个要替换的旧字符串和一个新字符串。 我在文件中有一个标头,它是由项目中的另一个函数制成的。 我的问题是,当我进行检查并测试代码时,它会显示所需的结果,但是当我检查目录中的文件时,没有任何更改,因此该功能基本上无法正常工作。

另一件事是 while循环无法正常工作,我不知道为什么!您可以通过运行代码来理解。

我最近开始编码,所以这让我感到压力很大。

功能:

import csv
from tempfile import NamedTemporaryFile
import shutil

def update_student_name():
    result = False
    f = input('Enter the file name with the extension .csv : ')
    temp_file = NamedTemporaryFile(mode= 'w' , delete=False)
    fields = ['Student Name', 'Student Grade']
    with open (f , 'r') as csv_file,temp_file:
        reader = csv.DictReader(csv_file, fieldnames=fields)
        writer = csv.DictWriter(temp_file, fieldnames=fields,lineterminator='\r')
        while not result:
            old_name = input('Enter the name you would like to update/correct: ').title()
            new_name = input('Enter the new name: ').title()
            for data in reader:
                if data['Student Name'] == old_name:
                    print(data)
                    data['Student Name']=data['Student Name'].replace(data['Student Name'],new_name)
                    print(data)
                    # print(f'({old_name}) has been updated to ({new_name})')
                    result = True
                elif data['Student Name'] != old_name:
                    print("This name is not in the file. Please enter a valid name")
            writer.writerow(data)      
    shutil.move(temp_file.name , f)

我正在处理的文件如下:

1 个答案:

答案 0 :(得分:0)

因此,我的一位朋友发现我需要重新组织代码,而我错过了一些概念。显然,在处理诸如我的案例elseelif这样的文件时,不能在while循环内使用这种方式。

  1. replace不能在此情况下使用,结果将不会保存在任何位置,因此不会写在文件上。使用update是更好的选择,因为文件是用csv.Dictreader读取的。
  2. 文件将从文件顶部开始搜索,因此如果以这种方式编写elif并将其放置在代码的末尾,则writrow也将被执行。

因此,如果有人需要它,则完全可以使用的固定代码是:

def update_student_name():
result = False
f = input('Enter the file name with the extension .csv : ')
temp_file = NamedTemporaryFile(mode= 'w' , delete=False)
fields = ['Student Name', 'Student Grade']
with open (f , 'r') as csv_file,temp_file:
    reader = csv.DictReader(csv_file)
    writer = csv.DictWriter(temp_file, fieldnames=fields, lineterminator='\r')
    writer.writeheader()
    while True:
        old_name = input('Enter the name you would like to update/correct: ').title()
        new_name = input('Enter the new name: ').title()
        for data in reader:
            if data['Student Name'] == old_name:
                data.update({'Student Name':new_name})
                print(f'({old_name}) has been updated to ({data["Student Name"]})')
                result = True
            writer.writerow(data)
        if not result:
            print("This name is not in the file. Please enter a valid name")
        else:
            break
shutil.move(temp_file.name , f)