使用 pandas.read_csv() 与 csv.reader() 冲突 - ValueError:对关闭的文件执行 I/O 操作

Using pandas.read_csv() is conflicting with csv.reader() - ValueError: I/O operation on closed file

提问人:bmalbusca 提问时间:2/17/2021 最后编辑:bmalbusca 更新时间:2/17/2021 访问量:203

问:

我正在解析一个通过 POST 发送的 csv 文件,然后将其转换为 JSON。当我在通过 pandas 之前使用包验证 csv 时,问题就出现了。验证器函数完成了她的工作,然后,熊猫的正常读数给出了错误FormData()ValueError: I/O operation on closed file


if request.method == 'POST':
        content = request.form
        data_header = json.loads(content.get('JSON'))
        filename = data_header['data'][0]['name']
        
        # Here! starts the problem
        # validator = validCSV(validator={'header': ["id","type","name","subtype","tag","block","latitude","longitude","height","max_alt","min_alt","power","tia","fwl"]})
        # print(validator.verify_header(request.files[filename]))
        # then pseudo-code: if returned false, will abort(404)
        
        try:
            df = pd.read_csv(request.files[filename], dtype='object')
            dictObj = df.to_dict(orient='records')

如果我们将问题跟踪到此包内部,我们将看到:

def verify_header(self, inputfile):
        with TextIOWrapper(inputfile, encoding="utf-8") as wrapper:
            header = next(csv.reader(wrapper))

似乎当文件被打开和关闭时,熊猫不再允许使用 .但是,对于只读取标题来说,伪造文件的副本似乎是一种浪费,我喜欢使用 的想法,因为在其他示例中显示读取 csv 文件的效率比 pandas 更高。TextIOWrapperread_csv()csv.reader()

在另一个包打开文件后,可以做些什么来防止 I/O 错误?或者一种简单有效的方法来验证 csv,而无需使用沉重的 pandas

python pandas csv io

评论

2赞 Marmaduke 2/17/2021
使用 csv.reader() 验证 csv 可能比 pandas 更快,但如果您无论如何都要加载 pandas,那么使用 csv.reader 进行预过滤真的会加快速度吗?你用这种方式更快地发现错误吗?检测错误的速度对您的用例真的重要吗?csv.reader 会检查熊猫不会吗?如果您确实需要使用 csv 阅读器进行预检查,则必须以某种方式缓存文件。也许是缓冲的 IO 读取器?docs.python.org/3/library/io.html#buffered-streams
0赞 bmalbusca 2/17/2021
在这种情况下,时间很重要,因为 api 服务器将同时验证多个上传请求。

答:

2赞 bmalbusca 2/17/2021 #1

解决方案是 seek() 在读取第一行后指向文件开头的指针。阅读的过程几乎和熊猫一样。唯一明显的优点是它不依赖于导入/安装 pandas。

wrapper = StringIO(inputfile.readline().decode('utf-8'))
        header = next(csv.reader(wrapper,  delimiter=','))
        inputfile.seek(0,0)