You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python3 Flask脚本写入文件时自动添加空行的问题求助

解决Flask编辑器保存后出现多余空行的问题

这个问题的核心是文本模式下换行符的自动转换,再加上你代码里的几个小疏漏,导致换行被重复处理,最终出现多余空行。让我一步步拆解原因和解决方案:

问题原因分析

  • 换行符自动转换:在Windows系统中,Python的open()函数默认使用文本模式,会自动将文件中的\r\n(Windows换行)转换为\n(Unix换行)用于读取,写入时又会把\n转换回\r\n。一来一回,原本的单个换行就被加倍了。
  • textarea提交特性:浏览器会把textarea中的换行以\n的形式提交给服务器,和文件原本的换行格式叠加后,就会产生重复空行。
  • 无效的代码操作:你在save()函数里写了i.replace('\n', ''),但字符串是不可变类型,这个方法会返回新字符串却没赋值给i,所以这行代码完全没生效,反而如果生效了会直接删掉所有换行,造成更糟的问题。
  • 多余的循环处理:你通过contents.items()循环获取表单值,其实直接用request.form['script']就能拿到textarea的完整内容,完全没必要多此一举。

这些因素叠加起来,就导致了原1个空行变3个、2个空行变5个的现象。

修复后的代码

1. 修改/editor路由的文件读取逻辑

读取文件时添加newline=''参数,禁用自动换行转换,保持原文件的换行格式:

@app.route('/editor',methods = ['POST', 'GET'])
def result():
    if request.method == 'POST':
        result = request.form
        # 注意:全局变量在多用户场景下极易冲突,后面会给出替代方案
        global file
        file = result['script']
        # 添加newline='',禁用自动换行转换
        with open(file, "r+", newline='') as f:
            contents = f.read()
        return render_template("result.html", result=result, file=file, cont=contents)

2. 修改/save路由的文件写入逻辑

同样添加newline='',直接获取表单内容,去掉无效的replace操作:

@app.route('/save',methods = ['POST', 'GET'])
def save():
    if request.method == 'POST':
        # 直接获取textarea的完整内容
        script_content = request.form['script']
        global file
        # 添加newline='',保持换行符原样写入
        with open(file, 'w+', newline='') as ope:
            ope.write(script_content)
        return redirect("/", code=302)

3. 额外优化:避免使用全局变量file

全局变量file在多用户同时访问时会被覆盖,导致用户A的文件名被用户B替换,写入错误的文件。建议改用表单隐藏字段传递文件名:

在模板的form里添加隐藏字段:

<form action = "http://192.168.#.###:5000/save" method = "POST" id="form">
    <input type="hidden" name="filename" value="{{ file }}">
    <textarea name="script" form="form" rows="10" cols="100">{{cont}}</textarea>
    <p><input type = "submit" value = "Save" /></p>
</form>

然后在/save路由中通过表单获取文件名,去掉全局变量:

@app.route('/save',methods = ['POST', 'GET'])
def save():
    if request.method == 'POST':
        script_content = request.form['script']
        file = request.form['filename']
        with open(file, 'w+', newline='') as ope:
            ope.write(script_content)
        return redirect("/", code=302)

这样不仅解决了多余空行的问题,还避免了多用户场景下的文件冲突风险。

内容的提问来源于stack exchange,提问作者ScottBot10

火山引擎 最新活动