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

Python拼接文件并添加换行:应选文本模式还是二进制模式?

解决Windows下Python拼接文件的乱码与换行问题

我来帮你搞定这个问题!你遇到的情况其实是Windows系统下文本模式和二进制模式读写文件的典型差异导致的:

问题根源

  • 文本模式乱码:Windows下用open()默认文本模式时,会用系统默认编码(Win7通常是GBK)去解码文件,如果你的源文件是UTF-8或其他编码,就会出现解码错误,导致乱码。而且文本模式还会自动转换换行符(把\n转成\r\n),如果文件里有特殊字节,也可能被误处理。
  • 二进制模式无换行:二进制模式rb/wb直接读写字节,不会做编码转换和换行符转换,所以内容正常,但需要我们手动添加换行分隔每个文件。

修正后的代码

我把你的代码修改了一下,完美解决这两个问题:

import os
import shutil

def concatFiles():
    # 用原始字符串r''避免路径转义问题,替换成你的目标目录
    source_path = r'D:\conc'
    # 输出文件路径,自动放在源目录下
    output_file_path = os.path.join(source_path, 'combined_result.txt')

    # 获取目录下所有文件(自动跳过输出文件,可按需过滤格式)
    file_names = [
        f for f in os.listdir(source_path)
        if os.path.isfile(os.path.join(source_path, f)) and f != os.path.basename(output_file_path)
    ]

    with open(output_file_path, 'wb') as output_f:
        is_first_file = True
        for file_name in file_names:
            file_full_path = os.path.join(source_path, file_name)
            
            # 非第一个文件,先写入换行(Windows风格用b'\r\n',跨平台用b'\n')
            if not is_first_file:
                output_f.write(b'\r\n')
            is_first_file = False

            # 二进制读取源文件并高效写入输出
            with open(file_full_path, 'rb') as input_f:
                shutil.copyfileobj(input_f, output_f)
    
    print(f"所有文件已成功拼接至:{output_file_path}")

# 调用函数执行拼接
concatFiles()

关键细节说明

  • 路径处理:用原始字符串r''或者双反斜杠\\,避免Windows路径里的\被当成转义字符导致错误。
  • 换行控制:通过is_first_file标记避免输出文件开头出现空行;如果需要Windows原生的换行格式,用b'\r\n',如果要适配跨平台场景,改用b'\n'即可。
  • 文件过滤:代码自动跳过输出文件本身,防止循环写入;你还可以添加格式过滤,比如f.endswith('.txt')只处理文本文件。
  • 高效写入:用shutil.copyfileobj直接复制文件对象,比逐行读写效率高得多,尤其适合处理大文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:39:48