Python怎样读写文本文件_Python文件读写技巧总结

Python怎样读写文本文件_Python文件读写技巧总结
最新回答
中华一样的高傲

2020-12-10 05:30:06

Python读写文本文件的核心是使用内置的open()函数结合with语句,通过指定模式(如'r'、'w'、'a')和编码(如'utf-8'、'gbk')实现安全、高效的文本操作。 以下是具体技巧与注意事项:

一、基础读写操作
  1. 写入文件

    使用'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}")

  2. 读取文件

    使用'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}")

  3. 追加内容

    使用'a'模式在文件末尾追加内容,避免覆盖原文件。

    示例:try: with open('my_document.txt', 'a', encoding='utf-8') as f: f.write("追加的新内容n") print("追加成功")except IOError as e: print(f"追加错误: {e}")

二、高效处理大文件
  1. 逐行读取

    直接迭代文件对象,每次仅加载一行到内存,避免内存溢出。

    示例: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}")

  2. 分块读取

    对非结构化大文件,可指定每次读取的字节数(如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}")

三、编码问题与解决方案
  1. 乱码原因

    文件实际编码与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}")

  2. 解决方案

    明确指定编码:根据文件实际编码选择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())

四、常见陷阱与最佳实践
  1. 资源泄漏

    问题:未关闭文件句柄导致资源占用或数据损坏。

    解决:始终使用with语句自动关闭文件。# 错误示范(易遗漏f.close())f = open('file.txt', 'r')data = f.read()f.close() # 若中间抛出异常,可能不会执行# 正确示范with open('file.txt', 'r') as f: data = f.read() # 自动关闭

  2. 路径问题

    问题:相对路径依赖当前工作目录,可能导致FileNotFoundError。

    解决

    使用绝对路径或动态构建路径(如os.path模块)。

    import osscript_dir = os.path.dirname(os.path.abspath(__file__))file_path = os.path.join(script_dir, 'data', 'file.txt')

  3. 权限问题

    问题:无权限写入受保护目录(如/root)。

    解决:选择用户有权限的目录(如主目录或临时目录)。

  4. 覆盖风险

    问题:误用'w'模式覆盖重要文件。

    解决

    追加内容用'a'模式。

    需覆盖时先备份,或使用'x'模式(文件已存在时报错)。

    try: with open('new_file.txt', 'x', encoding='utf-8') as f: f.write("仅当文件不存在时创建")except FileExistsError: print("文件已存在,未覆盖")

五、结构化文件处理
  1. CSV文件

    使用csv模块逐行读取,避免内存溢出。

    import csvwith open('data.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row) # 每行是一个列表
  2. 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语句、逐行迭代和明确编码参数,可高效安全地完成文本读写任务,避免常见陷阱。