Python脚本在csv中创建意外的空行(使用bottle,csv,os)

时间:2015-08-30 07:59:52

标签: python csv cookies bottle

初始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')

如何防止创建这些空白行,因为每次更改密码时,空行数会大幅增加?

1 个答案:

答案 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。