使用JavaScript将tsv文件上传按钮添加到Jupyter笔记本
因此,我正在使用Jupyter4.x和Python3.5,试图“上传”一个使用JavaScript将tsv文件上传按钮添加到Jupyter笔记本,javascript,html,python-3.x,jupyter-notebook,filereader,Javascript,Html,Python 3.x,Jupyter Notebook,Filereader,因此,我正在使用Jupyter4.x和Python3.5,试图“上传”一个.tsv,但实际上只是试图将其捕获为一个字符串,然后使用 setTimeout(function(){IPython.notebook.kernel.execute(“stringData=StringIO(+“fr.result”)”);},5000) 要让FileReader()对象有时间完成二进制字符串转换,请将字符串保存到python变量中。我通过在控制台中打印整个.tsv文件来测试Filereader()是否正常
.tsv
,但实际上只是试图将其捕获为一个字符串,然后使用
setTimeout(function(){IPython.notebook.kernel.execute(“stringData=StringIO(+“fr.result”)”);},5000)代码>
要让FileReader()
对象有时间完成二进制字符串转换,请将字符串保存到python变量中。我通过在控制台中打印整个.tsv
文件来测试Filereader()
是否正常工作。但是,由于某些原因,stringData在python端仍然没有定义
%%HTML
<input type="file" id="CSVFileInput" onchange="handleFiles(this.files)" value="upload csv">
<script>
var inputElement=document.getElementById('CSVFileInput');
function handleFiles() {
var file = inputElement.files[0];
var fr = new FileReader();
fr.readAsText(file);
var outputString=fr.result;
var command = "dataString ='"+outputString+"'";
setTimeout(function(){
IPython.notebook.kernel.execute(command);}
,5000);
}
inputElement.addEventListener("change", handleFiles, false);
</script>
另外,我对javascript有点陌生,所以欢迎任何建议,我只认为这是一种简单的方法。请?当然,非常感谢 FileReader
方法是异步的,因此在尝试将outputString
设置为结果时没有加载数据
处理此问题的正确方法是使用load
事件处理程序,因此,您可以将代码修改为以下内容,而不是使用setTimeout()
(异步处理不可靠):
function handleFiles() {
var file = this.files[0]; // "this" is the calling element
var fr = new FileReader();
fr.onload = function() {
var outputString = this.result; // here the data is ready. Now "this" = fr
var command = "dataString ='" + outputString + "'";
IPython.notebook.kernel.execute(command);
};
fr.readAsText(file); // invoked asynchronously
}
还要删除HTML中的内联JavaScript:
<input type="file" id="CSVFileInput" onchange="handleFiles(this.files)" value="upload csv">
函数句柄文件(){
var file=this.files[0];/“this”是调用元素
var fr=new FileReader();
fr.onload=函数(){
var outputString=this.result;//这里数据准备就绪。现在“this”=fr
var command=“dataString=”+outputString+”;
//IPython.notebook.kernel.execute(命令);
log(“加载的文件.命令:”,命令);
};
fr.readAsText(文件);//异步调用
}
document.getElementById(“CSVFileInput”).addEventListener(“更改”,HandleFile)代码>
FileReader
方法是异步的,因此在尝试将outputString
设置为结果时没有加载数据
处理此问题的正确方法是使用load
事件处理程序,因此,您可以将代码修改为以下内容,而不是使用setTimeout()
(异步处理不可靠):
function handleFiles() {
var file = this.files[0]; // "this" is the calling element
var fr = new FileReader();
fr.onload = function() {
var outputString = this.result; // here the data is ready. Now "this" = fr
var command = "dataString ='" + outputString + "'";
IPython.notebook.kernel.execute(command);
};
fr.readAsText(file); // invoked asynchronously
}
还要删除HTML中的内联JavaScript:
<input type="file" id="CSVFileInput" onchange="handleFiles(this.files)" value="upload csv">
函数句柄文件(){
var file=this.files[0];/“this”是调用元素
var fr=new FileReader();
fr.onload=函数(){
var outputString=this.result;//这里数据准备就绪。现在“this”=fr
var command=“dataString=”+outputString+”;
//IPython.notebook.kernel.execute(命令);
log(“加载的文件.命令:”,命令);
};
fr.readAsText(文件);//异步调用
}
document.getElementById(“CSVFileInput”).addEventListener(“更改”,HandleFile)代码>
因此,@K3N确实给了我一个关于异步函数的宝贵的谜题和教训。然而,主要的问题是python无法识别它从javascript接收到的字符串输入,所以我想我应该与大家分享我的旅程。最后,我将字符串转换为2d javascript数组,然后我将列名的第一行shift()
去掉,将其余的行转置,并从英语中清除所有阻止它工作的愚蠢内容(引号和撇号)。现在我可以pd.DataFrame(dict(zip(colNames,cols))
并在从文件系统读入它时在同一.tsv
上运行所有计算。这是完整的脚本,基本上是@K3N向我展示的补丁,加上pythonify(arr)
函数:
函数句柄文件(){
//读入文件并实例化filereader
让file=this.files[0];/“this”是调用元素
设fr=newfilereader();
fr.onload=函数(){
//行上分离式测力仪(CRLF)
让outputBuffer=this.result.split(“\r\n”);
让命令;
//将outputBuffer拆分为2d数组
outputBuffer=outputBuffer.map(line=>line.split(“\t”);
//输出缓冲区中的pop名称行
让names=outputBuffer.shift();
//优化转置
outputBuffer=outputBuffer.reduce(
(临时,世界其他地区)=>
行映射((元素,i)=>
(温度[i]| |[]).concat(元素))
,[]//初始化临时值
);
//构建python命令
command=“colNames=“+pythonify(名称);
//向笔记本内核发送命令
IPython.notebook.kernel.execute(命令);
//循环在python端追加列
对于(设i=0;i 对于(i=0;iSo,@K3N无疑给了我一个关于异步函数的宝贵的谜题和教训。然而,主要问题是python无法识别它从javascript接收的字符串输入,因此我想我应该与大家分享我的旅程。我最终将字符串转换为2d javascript数组,然后我shift()
将列名的第一行去掉,将其余的行转置,并从英语中清除所有阻止它工作的愚蠢内容(引号和撇号)。现在我可以pd.DataFrame(dict(zip(colNames,cols)))
并在从文件系统读入时在同一个.tsv
上运行所有计算。以下是完整的脚本,基本上是@K3N向我展示的补丁以及pythonify(arr)
函数:
函数句柄文件(){
//读入文件并实例化filereader
让file=thi
document.getElementById("CSVFileInput").addEventListener("change", handleFiles);