我正在尝试将已上传的 .xls 文件复制到 Python中的本地位置。但复制的excel文件具有二进制字符,如
`èÃÖzû¬öv¢Ã¿Þ#Ö}®×BˆGŸì“þ¨Kù¯éä:ÅBHoÑ?±M¾«fò¶Ü2›§]¹Õ®JiËXgE*æÆQÁ¯¸&ÿŒ¨#ºÎsè=³`îž5¹‰nŠ¬Ëΰ±$õºé/š]´cZ̤Bž’8*ûM¸¾,ú£.ú]ÑwÑëü‡þR2*7ª`
我可以在代码中进行哪些更改以使其正常工作。 我使用以下代码,
index.html文件:
<body>
<form name='getXlFileForm' action='reader.py' method='post' enctype='multipart/form-data'>
<input type='file' name='xlFileFromForm' />
<input type='submit' value='Upload' />
</form>
</body>
reader.py文件:
cgitb.enable()
requestForm = cgi.FieldStorage()
uploadedFiles = requestForm['xlFileFromForm']
if uploadedFiles.filename:
tf = tempfile.NamedTemporaryFile(prefix='c:/myOut/', suffix='.xls', delete=False)
uploadedName = os.path.basename(uploadedFiles.filename)
open(tf.name,"w").write(uploadedFiles.file.read())
#also tried "wb" mode
答案 0 :(得分:0)
我很困惑为什么文件在上传期间变成二进制格式
自您创建文件以来,您的文件一直是二进制文件。您通常只使用一个软件程序来查看它,该程序将二进制数据解释为行和列,包括文本数据,公式,图形等。
如果您查看程序中的.xls文件,该程序不知道如何将二进制数据转换为电子表格(如文本编辑器),则二进制数据将转换为字符,这通常看起来像乱码。
以下是我在文本编辑器中打开的.xls文件的一部分:
#0_);\("$"#,##0\)..!......"$"#,##0_);[Red]\("$"#,##0\).."......"$"#,##0.00_);\("$"#,##0.00\)..'...".."$"#,##0.00_);[Red]\("$"#,##0.00\)..7.*.2.._("$"*
#,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)....).).._(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)..?.,.:.._("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)..6.+.1.._(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_).
编辑:
您肯定希望以二进制模式编写:wb
。看看你是否可以更简单地工作:
#!/usr/bin/env python
import cgi
import cgitb
cgitb.enable()
requestForm = cgi.FieldStorage()
uploadedFile = requestForm['xlFileFromForm']
if uploadedFile.file:
f = open('uploaded.xls', 'wb') #writes file to the cgi-bin directory
f.write(uploadedFile.file.read())
f.close()
msg = 'wrote file'
else:
msg = "failed"
html = """Content-type:text/html\r\n\r\n
<html>
<head>
<title>Test CGI</title>
</head>
<body>
<div>Hello: {}</div>
</body>
</html>
""".format(msg)
print html
当我这样做时,新文件的文件大小与我上传的.xls文件完全相同。
HTML:
<form name='getXlFileForm' action='cgi-bin/mycgi2.py' method='post'
enctype='multipart/form-data'>
<input type='file' name='xlFileFromForm' />
<input type='submit' value='Upload' />
</form>