You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python将UDP服务回显内容写入文件时换行符( )重复该如何排查?

问题根因
  • 核心问题是文本模式写入时的自动换行符转换:你读取源文件时使用二进制模式rb,会原样读取所有字节(包括Windows平台下的换行符序列\r\n),网络传输环节没有修改内容,接收的字节和源文件完全一致。但打开输出文件用的是默认文本模式w,Windows系统下的文本模式会自动将字符串中的\n替换为\r\n:
    源文件的换行\r\n解码为字符串后保留\r\n,写入时\n被替换为\r\n,最终写入文件的字节为\r\r\n,绝大多数文本编辑器会将该序列识别为两次换行,因此出现多余空行。而print输出到控制台时,连续的\r只会触发一次行首复位操作,视觉上不会显示多余换行,和你观察到的现象完全吻合。
  • 潜在逻辑隐患:当前接收端的执行顺序是「打印内容→判断是否为EOF→写入文件」,如果收到EOF标记,仍然会多打印一次EOF内容,不符合预期。
修复方案

两种方案二选一即可:

  1. 输出文件改用二进制模式写入,和读取逻辑完全对应,彻底避免编码和换行转换问题,同时调整EOF判断顺序:
def communication_from_server(s, size):
    # 二进制写模式,直接写入接收的字节,无需编解码
    g = open("output.txt", 'wb')
    while True:
        line = s.recv(size)
        # 先判断EOF,避免打印、写入无效标记
        if line == b'EOF':
            break
        print(line.decode("utf-8"))
        g.write(line)
    g.close()
  1. 如果需要保留文本模式写入,打开文件时指定newline=''参数禁用自动换行转换即可:
g = open("output.txt", 'w', encoding="utf-8", newline='')

你尝试修改打开模式无效的原因是a为追加模式,本质还是文本模式,仍然会触发换行符自动转换,因此不会解决问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:54:03