所以我的任务是创建一个函数,该函数返回子字符串在给定字符串中出现的次数以及每次出现时该子字符串的索引。
但是,当我运行代码时,出现“对关闭文件的I / O操作”错误。有人知道如何解决这个问题吗?
# 1. Import the text.csv file
import csv
with open('text.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
# 2. Complete function counter. The function should return the number
of times the substring appears & their index
def counter(substring):
substring_counter = 0
string = csv_reader
for substring in csv_file:
substring_counter = substring_counter + 1
print('Counter = ', substring_counter)
print(string.find(substring))
# do not edit the code below
counter("TCA")
答案 0 :(得分:0)
之所以发生这种情况,是因为csv.reader
在模块而不是函数中是本地的。 csv模块返回的reader对象维护对文件句柄的引用(由open
返回)。在for循环的第一次迭代中,该文件句柄最终结束,即耗尽了,但在第二次迭代中,您使csv reader对象尝试从文件的末尾读取,从而导致该错误
在循环的每次迭代之前或之后,您可以通过执行以下操作将文件指针重置为开始:csv_file.seek(0)
更好的解决方案是将所有文件内容存储到缓冲区中并重复访问(而不必从文件句柄中重新读取文件内容)。
答案 1 :(得分:0)
由于您使用的是with
(很好),因此您已明确限制了打开文件的范围,但是正如前面的响应所指出的那样,csv reader对象在该范围之外使用。在这种情况下,读取器只是文件的包装器,一开始并不读取所有内容。您要么需要读取with
中的整个文件,要么将with
移动到函数内以及引用该文件下的所有内容。