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内容,不符合预期。
修复方案
两种方案二选一即可:
- 输出文件改用二进制模式写入,和读取逻辑完全对应,彻底避免编码和换行转换问题,同时调整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()
- 如果需要保留文本模式写入,打开文件时指定
newline=''参数禁用自动换行转换即可:
g = open("output.txt", 'w', encoding="utf-8", newline='')
你尝试修改打开模式无效的原因是a为追加模式,本质还是文本模式,仍然会触发换行符自动转换,因此不会解决问题。
内容的提问来源于stack exchange,提问作者vdaiep
相关产品推荐
相关产品推荐

