替换 CSV 文件中用户输入的字符串(重写文件)
replace a string from user input in a CSV file (rewrite the file)
我正在尝试创建一个函数,让 用户输入 文件名、要替换的旧字符串和新字符串。
我在文件中有一个 header ,它是用我项目中的另一个函数制作的。
我的问题是,当我进行检查和测试代码时,它会显示所需的结果,但是当我去检查目录中的文件时,没有任何变化,因此 func 基本上无法正常工作。
另一件事是 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)
我正在处理的文件如下所示:
所以我的一个朋友发现我需要重新组织我的代码并且我错过了一些概念。显然,在处理像我的案例这样的文件时,else
和 elif
不能在 while 循环中以这种方式使用。
replace
不能用在这件事上,结果不会保存在任何地方,所以不会写在文件上。使用 update
是更好的选择,因为文件是用 csv.Dictreader
. 读取的
- file 将从文件的顶部开始搜索,因此
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)
我正在尝试创建一个函数,让 用户输入 文件名、要替换的旧字符串和新字符串。 我在文件中有一个 header ,它是用我项目中的另一个函数制作的。 我的问题是,当我进行检查和测试代码时,它会显示所需的结果,但是当我去检查目录中的文件时,没有任何变化,因此 func 基本上无法正常工作。
另一件事是 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)
我正在处理的文件如下所示:
所以我的一个朋友发现我需要重新组织我的代码并且我错过了一些概念。显然,在处理像我的案例这样的文件时,else
和 elif
不能在 while 循环中以这种方式使用。
replace
不能用在这件事上,结果不会保存在任何地方,所以不会写在文件上。使用update
是更好的选择,因为文件是用csv.Dictreader
. 读取的
- file 将从文件的顶部开始搜索,因此
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)