2020-12-10 05:30:06
Python读写文本文件的核心是使用内置的open()函数结合with语句,通过指定模式(如'r'、'w'、'a')和编码(如'utf-8'、'gbk')实现安全、高效的文本操作。 以下是具体技巧与注意事项:
一、基础读写操作写入文件
使用'w'模式创建新文件或覆盖已有文件,需指定编码(如utf-8)。
示例:try: with open('my_document.txt', 'w', encoding='utf-8') as f: f.write("第一行文本n") f.write("第二行文本n") print("写入成功")except IOError as e: print(f"写入错误: {e}")
读取文件
使用'r'模式读取文件内容,若文件不存在会抛出FileNotFoundError。
示例:try: with open('my_document.txt', 'r', encoding='utf-8') as f: content = f.read() # 读取全部内容 print(content)except FileNotFoundError: print("文件不存在")except IOError as e: print(f"读取错误: {e}")
追加内容
使用'a'模式在文件末尾追加内容,避免覆盖原文件。
示例:try: with open('my_document.txt', 'a', encoding='utf-8') as f: f.write("追加的新内容n") print("追加成功")except IOError as e: print(f"追加错误: {e}")
逐行读取
直接迭代文件对象,每次仅加载一行到内存,避免内存溢出。
示例:try: with open('large_file.txt', 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): print(f"第{line_num}行: {line.strip()}")except FileNotFoundError: print("文件不存在")except IOError as e: print(f"读取错误: {e}")
分块读取
对非结构化大文件,可指定每次读取的字节数(如f.read(1024))。
示例:chunk_size = 1024 # 每次读取1KBtry: with open('large_file.bin', 'rb') as f: # 二进制模式 while True: chunk = f.read(chunk_size) if not chunk: break process_chunk(chunk) # 处理分块数据except IOError as e: print(f"读取错误: {e}")
乱码原因
文件实际编码与open()指定的编码不一致(如用utf-8读取gbk文件)。
示例错误:try: with open('gbk_file.txt', 'r', encoding='utf-8') as f: print(f.read()) # 可能抛出UnicodeDecodeErrorexcept UnicodeDecodeError as e: print(f"解码错误: {e}")
解决方案
明确指定编码:根据文件实际编码选择utf-8、gbk或latin-1。
自动检测编码:使用chardet库猜测编码(非100%准确)。import chardetwith open('unknown_file.txt', 'rb') as f: raw_data = f.read() result = chardet.detect(raw_data) encoding = result['encoding']with open('unknown_file.txt', 'r', encoding=encoding) as f: print(f.read())
资源泄漏
问题:未关闭文件句柄导致资源占用或数据损坏。
解决:始终使用with语句自动关闭文件。# 错误示范(易遗漏f.close())f = open('file.txt', 'r')data = f.read()f.close() # 若中间抛出异常,可能不会执行# 正确示范with open('file.txt', 'r') as f: data = f.read() # 自动关闭
路径问题
问题:相对路径依赖当前工作目录,可能导致FileNotFoundError。
解决:
使用绝对路径或动态构建路径(如os.path模块)。
import osscript_dir = os.path.dirname(os.path.abspath(__file__))file_path = os.path.join(script_dir, 'data', 'file.txt')权限问题
问题:无权限写入受保护目录(如/root)。
解决:选择用户有权限的目录(如主目录或临时目录)。
覆盖风险
问题:误用'w'模式覆盖重要文件。
解决:
追加内容用'a'模式。
需覆盖时先备份,或使用'x'模式(文件已存在时报错)。
try: with open('new_file.txt', 'x', encoding='utf-8') as f: f.write("仅当文件不存在时创建")except FileExistsError: print("文件已存在,未覆盖")CSV文件
使用csv模块逐行读取,避免内存溢出。
import csvwith open('data.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row) # 每行是一个列表JSON文件
大文件可逐行解析或使用ijson库流式处理。
import jsonwith open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) # 适用于小文件# 大文件逐行处理示例with open('large_data.jsonl', 'r', encoding='utf-8') as f: for line in f: item = json.loads(line) # 处理每行JSON对象总结:Python文件操作需重点关注模式选择、编码一致性、资源管理及路径处理。通过with语句、逐行迭代和明确编码参数,可高效安全地完成文本读写任务,避免常见陷阱。