初始users.csv文件 - 列分别是用户名,真实姓名,密码。
fraud,mike ross,iloveharveynew
abc,ab isss c,coolgal
xyz,name last,rockpassnew
算法 -
1.输入用户名(来自cookie)&来自html表单的新密码
2.迭代csv文件以打印所有不包含' username'到一个新文件final.csv
3.删除users.csv文件。
4.在final.csv文件中附加用户名,真实姓名,新密码。
5.将final.csv重命名为users.csv
例如,让我们说用户xyz已登录,并且从cookie中检索到了username = xyz。用户将密码更改为rockpassnewnew。
输出users.csv文件 -
fraud,mike ross,iloveharveynew
abc,ab isss c,coolgal
xyz,name last,rockpassnewnew
这是定义的函数,它从控制器调用 -
def change(self, new_password):
errors = []
if len(new_password) < 3: errors.append('new password too short')
if errors:
return errors
else:
with open('users.csv','r') as u:
users = csv.reader(u)
with open('final.csv', 'a') as f:
final=csv.writer(f)
for line in users:
variableforchecking1 = bottle.request.get_cookie('username')
if variableforchecking1 not in line:
final.writerow(line)
os.remove('users.csv')
variableforchecking1 = bottle.request.get_cookie('username')
variableforchecking2 = bottle.request.get_cookie('real_name')
with open('final.csv', 'a') as f:
final=csv.writer(f)
final.writerow([variableforchecking1, variableforchecking2, new_password])
os.rename ('final.csv','users.csv')
return []
调用此函数的控制器代码是 -
@bottle.get('/change')
def change():
return bottle.template('change')
@bottle.post('/change')
def changePost():
new_password = bottle.request.forms.get('new-password')
username = me.username()
errors = me.change(new_password)
if errors:
return bottle.template('change', errors=errors)
me.login(username, new_password)
return bottle.redirect('/home')
如何防止创建这些空白行,因为每次更改密码时,空行数会大幅增加?
答案 0 :(得分:0)
使用csv.writer
打开要写入的CSV文件时,请注意如何打开文件。
问题是csv.writer
自己处理行结尾。如果未小心打开使用open
打开的文件,则在写入数据时,文件对象也将用CR + LF替换LF行结尾。因此,当两者都进行这些更改时,输出文件中的行结尾可以变为CR + CR + LF。文本编辑器通常会将其解释为两行结尾。
修复方法是在Python 2中以二进制模式打开文件,或在Python 3 as recommended by the documentation for the csv
module中使用newline=''
打开文件。为此,请替换两次出现的
with open('final.csv', 'a') as f:
与
with open('final.csv', 'ab') as f:
如果您使用的是Python 2或
with open('final.csv', 'a', newline='') as f:
如果您使用的是Python 3。