提问人:bmalbusca 提问时间:2/17/2021 最后编辑:bmalbusca 更新时间:2/17/2021 访问量:203
使用 pandas.read_csv() 与 csv.reader() 冲突 - ValueError:对关闭的文件执行 I/O 操作
Using pandas.read_csv() is conflicting with csv.reader() - ValueError: I/O operation on closed file
问:
我正在解析一个通过 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 更高。TextIOWrapper
read_csv()
csv.reader()
在另一个包打开文件后,可以做些什么来防止 I/O 错误?或者一种简单有效的方法来验证 csv,而无需使用沉重的 pandas
答:
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)
评论