同一函数内两次使用csv.reader触发TypeError,求解决方案
解决两次调用csv.reader时的TypeError问题
嘿,我一眼就看出问题所在了——你在第一个with代码块里,把函数参数input_file(原本是文件路径字符串)重新赋值成了文件对象!
看这段出问题的代码:
def make_template(input_file): import csv with open(input_file,'rt') as input_file: # 这里把input_file变量覆盖成了文件对象 reader = csv.reader(input_file, delimiter='\t') ## code with open(input_file,'rt') as inputf, open('template.csv','w') as final: # 现在input_file是文件对象,不是路径! writer = csv.writer(final, delimiter='\t') reader1 = csv.reader(inputf, delimiter='\t') ## code
当第一个with块执行完后,input_file已经不再是你传入的文件路径字符串了,而是一个已经被关闭的文件对象。所以第二次调用open(input_file)时,open()函数收到的不是它需要的路径(str/bytes/os.PathLike类型),而是一个文件对象,自然就抛出了TypeError: expected str, bytes or os.PathLike obj...的错误。
修正方案
很简单,只要避免覆盖函数参数的变量名就行,给第一个with里的文件对象换个名字,比如input_f:
def make_template(input_file): import csv # 把文件对象变量名改成input_f,不覆盖原参数input_file with open(input_file,'rt') as input_f: reader = csv.reader(input_f, delimiter='\t') ## 你的处理代码 # 现在input_file还是原来的路径字符串,可以正常传入open() with open(input_file,'rt') as inputf, open('template.csv','w') as final: writer = csv.writer(final, delimiter='\t') reader1 = csv.reader(inputf, delimiter='\t') ## 你的处理代码
额外小建议
- 尽量把
import csv放在函数外面、文件顶部,这样更符合Python编码规范,避免每次调用函数都重复导入模块。 - 如果两次文件读取都是处理同一个文件的内容,其实可以考虑把文件内容一次性读取到内存里(比如转成列表),这样只需要打开一次文件,效率更高,示例如下:
def make_template(input_file): import csv # 一次性读取所有行到内存 with open(input_file,'rt') as input_f: reader = csv.reader(input_f, delimiter='\t') rows = list(reader) # 使用内存中的rows完成第一次处理 ## 第一次处理代码,直接遍历rows即可 # 写入模板时,直接用内存中的rows,无需再次打开原文件 with open('template.csv','w') as final: writer = csv.writer(final, delimiter='\t') writer.writerows(rows) ## 其他处理代码
这样既避免了重复打开文件,也彻底杜绝了变量覆盖的问题。
内容的提问来源于stack exchange,提问作者Lala
相关产品推荐
相关产品推荐

