你好,
编辑了2018年9月19日14:38以澄清我的问题
首先,感谢您阅读我的问题!我希望我的问题是可以解决的,因为我在这项具体任务的研究中找不到任何答案。在
上下文:
有一个测量系统将测量数据存储在MS Access.mdb文件中。文件的典型大小约为100到200 MB,最长的表(约占所需空间的99%)有大约40万到60万个数据集。压缩后的压缩字节数为:压缩后的压缩字节数为171字节,压缩后的压缩空间为:压缩后的压缩字节数为:压缩后的文件数为0。在
方法:
如果要计算测量数据,需要先提取.zip文件:
import zipfile
from zipfile import ZipFile
"""Extract example .zip file into this directory"""
path = "C:/20180730_0931.zip"
archive = zipfile.ZipFile(path, 'r')
archive.extractall(path=None, members=None, pwd=None)
然后我可以访问提取的数据库:
^{pr2}$那么,有什么问题?
由于有多个用户,我认为这是一个糟糕的解决方案,只提取zip文件并在之后删除mdb文件会导致问题。所以我的想法是,zip文件被提取到用户系统上的一个临时文件中。正如@Goyo指出的,存储临时文件有不同的方法(硬盘驱动器、闪存驱动器、内存文件系统等等)。一开始我只想找到一个可行的解决方案,但当然我更喜欢最快的方法。在
程序的工作流程如下所示:
我试着使用不同的方法,比如StringIO
、zipfile.read
或{zipfile.read
和{
fenxzip = zipfile.ZipFile("C:/20180730_0931.zip", 'r')
fenfile=tempfile.SpooledTemporaryFile(max_size=10000000000,mode='w+b')
fenfile.write(fenxzip.read(fenxzip.namelist()[0]))
#Yay a temp file... or is it?
fenfile.close()
fenxzip.close()
更新1-编辑时间:2018年9月20日10:54
由于SpooledTemporaryFile
没有名字,我做了以下事情:
import pyodbc
import tempfile
from zipfile import ZipFile
File = "C:/20180730_0931.zip"
mdbzip = zipfile.ZipFile(File, 'r')
mdbtemp=tempfile.TemporaryFile(mode='w+b')
mdbtemp.write(mdbzip.read(mdbzip.namelist()[0]))
MDB = mdbtemp.name; DRV = '{Microsoft Access Driver (*.mdb)}'; PWD = ''
# connect to db
con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))
cur = con.cursor()
# run a query and get the results
SQL = 'SELECT * FROM mytable;'
rows = cur.execute(SQL).fetchall()
for row in rows:
print(row)
cur.close()
con.close()
mdbtemp.close()
mdbzip.close()
在这种情况下,我有一个命名的临时文件,但我得到一个错误,即该文件已被使用:
pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver] '(unbekannt)' konnte nicht verwendet werden; Datei wird bereits verwendet. (-1024) (SQLDriverConnect); [HY000] [Microsoft][ODBC Microsoft Access Driver]Allgemeine Warnung Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x30dc Thread 0x2f0 DBC 0x5a10064 Jet' kann nicht geöffnet werden. (1); [HY000] [Microsoft][ODBC Microsoft Access Driver]Allgemeine Warnung Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x30dc Thread 0x2f0 DBC 0x5a10064 Jet' kann nicht geöffnet werden. (1); [HY000] [Microsoft][ODBC Microsoft Access Driver] '(unbekannt)' konnte nicht verwendet werden; Datei wird bereits verwendet. (-1024)")
那么,有没有可能,我的方法根本不可能?在
目前没有回答
相关问题 更多 >
编程相关推荐