Python 3.6.4复制CSV文件时出现String to byte转换错误求助
解决Python 3下CSV与NamedTemporaryFile的兼容问题
我明白你在Python 3里处理CSV和临时文件时遇到的困扰——Python 2和3在文本/二进制模式的处理上确实有很大差异,这也是问题的核心所在。下面我给你一步步拆解问题并给出解决方案:
问题根源
在Python 3中,csv模块要求操作的是文本流,而非二进制流;同时NamedTemporaryFile的默认模式在不同平台(比如Windows和Linux)存在差异,再加上编码和换行符的处理区别,很容易触发报错。
正确的实现代码
你可以试试下面的代码,它兼顾了Python 3的文本模式要求、编码处理,以及临时文件的读写权限:
import csv from tempfile import NamedTemporaryFile # 1. 正确读取CSV文件:使用文本模式+指定编码 with open("Data.csv", "rt", encoding="utf-8", newline="") as csv_file: reader = csv.reader(csv_file) # 2. 创建临时文件:使用读写模式的文本流,确保可以后续读取内容 with NamedTemporaryFile(mode="wt+", encoding="utf-8", newline="", delete=False) as temp_file: writer = csv.writer(temp_file) # 迭代并写入所有行 for row in reader: writer.writerow(row) # 如果需要后续读取临时文件内容,移动文件指针到开头 temp_file.seek(0) # 示例:读取临时文件的第一行 print(temp_file.readline())
关键细节说明
newline=""参数:这是csv模块的硬性要求,它会让csv.reader和csv.writer自行处理换行符,避免跨平台的换行符解析混乱。- 指定
encoding:明确编码(比如utf-8)可以避免因系统默认编码不同导致的乱码或读取失败。 - NamedTemporaryFile的模式:
wt+表示可读写的文本模式,加上delete=False可以让临时文件在关闭后不立即删除(如果不需要保留临时文件,可去掉这个参数)。 - 文件指针移动:写入临时文件后,如果要马上读取内容,需要用
seek(0)把指针移到文件开头。
为什么之前的模式会报错?
- 用
rb模式打开CSV:csv.reader无法处理二进制流,Python 3严格区分文本和二进制类型,因此直接触发错误。 - 改成
rt但未处理其他细节:可能是没指定newline=""导致换行符解析错误,或者临时文件用了默认的二进制模式(比如w+b),写入文本内容时出现编码不兼容问题。
内容的提问来源于stack exchange,提问作者Sachu
相关产品推荐
相关产品推荐

