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
相关产品推荐
相关产品推荐

