Если вы хотите использовать механизмы кэширования, например Redis или Memcached , возможно, выбор DALMP может быть выбран. Он использует чистый MySQLi . Проверьте это: Уровень абстракции базы данных DALMP для MySQL с использованием PHP.
Кроме того, вы можете «подготовить» свои аргументы перед подготовкой своего запроса, чтобы вы могли создавать динамические запросы и в конце имеют полностью подготовленный запрос. Уровень абстракции базы данных DALMP для MySQL с использованием PHP.
Хорошо, после того, как я понял то, что Вы хотите, это столь же просто как использование второго аргумента zipfile.write
, где можно использовать то, что Вы хотите:
import zipfile
myZipFile = zipfile.ZipFile("zip.zip", "w" )
myZipFile.write("test.py", "dir\\test.py", zipfile.ZIP_DEFLATED )
создает zipfile, где test.py
был бы извлечен к каталогу, названному dir
РЕДАКТИРОВАНИЕ: Я когда-то должен был создать пустой каталог в zip-файле: это возможно. после кода выше просто удаляют файл test.py из zipfile, файла не стало, но пустой каталог остается.
после добавления некоторого импорта Ваш код хорошо работает для меня, как Вы называете сценарий, возможно, Вы могли сказать нам структуру папок '..\packed\bin' каталог.
я назвал Ваш код со следующими аргументами:
planName='test.zip'
files=['z.py',]
folders=['c:\\temp']
(success,filename)=createZipFile(planName,files,folders)
'
Heres отредактированный код я работал. На основе кода выше, взятый из списка рассылки. Я добавил импорт и сделал основную стандартную программу. Я также отключил игру с выходным именем файла для создания кода короче.
#!/usr/bin/env python
import os, zipfile, glob, sys
def addFolderToZip(myZipFile,folder):
folder = folder.encode('ascii') #convert path to ascii for ZipFile Method
for file in glob.glob(folder+"/*"):
if os.path.isfile(file):
print file
myZipFile.write(file, os.path.basename(file), zipfile.ZIP_DEFLATED)
elif os.path.isdir(file):
addFolderToZip(myZipFile,file)
def createZipFile(filename,files,folders):
myZipFile = zipfile.ZipFile( filename, "w" ) # Open the zip file for writing
for file in files:
file = file.encode('ascii') #convert path to ascii for ZipFile Method
if os.path.isfile(file):
(filepath, filename) = os.path.split(file)
myZipFile.write( file, filename, zipfile.ZIP_DEFLATED )
for folder in folders:
addFolderToZip(myZipFile,folder)
myZipFile.close()
return (1,filename)
if __name__=="__main__":
#put everything in sys.argv[1] in out.zip, skip files
print createZipFile("out.zip", [], sys.argv[1])
На работе, на моем поле Windows, этот код хорошо работал, но не создал "папок" в zipfile. По крайней мере, я вспоминаю, что это сделало. Теперь дома, на моем поле Linux, созданный zip-файл, кажется, плох:
$ unzip -l out.zip
Archive: out.zip
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of out.zip or
out.zip.zip, and cannot find out.zip.ZIP, period.
я не знаю, повредил ли я случайно код, я думаю, что это - то же. Межплатформенные проблемы? Так или иначе, не связанный с моим исходным вопросом; получение папок в zip-файле. Просто требуемый для регистрации кода я на самом деле работал, не код, которого я основывал свой код.
import zipfile
import os
class ZipUtilities:
def toZip(self, file, filename):
zip_file = zipfile.ZipFile(filename, 'w')
if os.path.isfile(file):
zip_file.write(file)
else:
self.addFolderToZip(zip_file, file)
zip_file.close()
def addFolderToZip(self, zip_file, folder):
for file in os.listdir(folder):
full_path = os.path.join(folder, file)
if os.path.isfile(full_path):
print 'File added: ' + str(full_path)
zip_file.write(full_path)
elif os.path.isdir(full_path):
print 'Entering folder: ' + str(full_path)
self.addFolderToZip(zip_file, full_path)
def main():
utilities = ZipUtilities()
filename = 'TEMP.zip'
directory = 'TEMP'
utilities.toZip(directory, filename)
main()
я работаю:
python tozip.py
Это - журнал:
havok@fireshield:~$ python tozip.py
File added: TEMP/NARF (7ª copia)
Entering folder: TEMP/TEMP2
File added: TEMP/TEMP2/NERF (otra copia)
File added: TEMP/TEMP2/NERF (copia)
File added: TEMP/TEMP2/NARF
File added: TEMP/TEMP2/NARF (copia)
File added: TEMP/TEMP2/NARF (otra copia)
Entering folder: TEMP/TEMP2/TEMP3
File added: TEMP/TEMP2/TEMP3/DOCUMENTO DEL FINAL
File added: TEMP/TEMP2/TEMP3/DOCUMENTO DEL FINAL (copia)
File added: TEMP/TEMP2/NERF
File added: TEMP/NARF (copia) (otra copia)
File added: TEMP/NARF (copia) (copia)
File added: TEMP/NARF (6ª copia)
File added: TEMP/NERF (copia) (otra copia)
File added: TEMP/NERF (4ª copia)
File added: TEMP/NERF (otra copia)
File added: TEMP/NERF (3ª copia)
File added: TEMP/NERF (6ª copia)
File added: TEMP/NERF (copia)
File added: TEMP/NERF (5ª copia)
File added: TEMP/NARF (8ª copia)
File added: TEMP/NARF (3ª copia)
File added: TEMP/NARF (5ª copia)
File added: TEMP/NERF (copia) (3ª copia)
File added: TEMP/NARF
File added: TEMP/NERF (copia) (copia)
File added: TEMP/NERF (8ª copia)
File added: TEMP/NERF (7ª copia)
File added: TEMP/NARF (copia)
File added: TEMP/NARF (otra copia)
File added: TEMP/NARF (4ª copia)
File added: TEMP/NERF
File added: TEMP/NARF (copia) (3ª copia)
, Как Вы видите, это работает, архив в порядке также. Это - рекурсивная функция, которая может архивировать всю папку. Единственная проблема состоит в том, что это не создает пустую папку.
Аплодисменты.
Zip-файл не имеет никакой структуры каталогов, он просто имеет набор путей и их содержания. Эти пути должны быть относительно мнимой корневой папки (сам zip-файл). ".. /" префиксы не имеют никакого определенного значения в zip-файле.
Полагают, что у Вас есть файл, a
, и Вы хотите сохранить его в "папке" в zip-файле. Все, что необходимо сделать, является префиксом имя файла с именем папки, храня файл в zipfile:
zipi= zipfile.ZipInfo()
zipi.filename= "folder/a" # this is what you want
zipi.date_time= time.localtime(os.path.getmtime("a"))[:6]
zipi.compress_type= zipfile.ZIP_DEFLATED
filedata= open("a", "rb").read()
zipfile1.writestr(zipi, filedata) # zipfile1 is a zipfile.ZipFile instance
я не знаю ни о каких реализациях ZIP, позволяющих включение пустой папка в zip-файле. Я могу думать об обходном решении (хранящий макет имя файла в zip "папка", которая должна быть проигнорирована на извлечении), но не портативный через реализации.
Когда Вы хотите создать пустую папку, можно сделать это как это:
storage = api.Storage.open("empty_folder.zip","w")
res = storage.open_resource("hannu//","w")
storage.close()
Папка не пихается в winextractor, но когда Вы извлекаете его, это, показал.
Ниже приведен код для архивирования всего каталога в zip-файл.
Кажется, это работает нормально, создавая zip-файлы как в Windows, так и в Linux. Выход файлы, кажется, извлекаются правильно в Windows (встроенная функция сжатых папок, WinZip и 7-Zip) и Linux. Однако в zip-файле появляются пустые каталоги быть сложной проблемой. Решение ниже, кажется, работает, но вывод "zipinfo" на linux касается. Также права доступа к каталогу не установлены правильно для пустых каталогов в zip-архиве. Это требует некоторые более глубокие исследования.
Я получил некоторую информацию из этой нити скоростной проверки и этой нити списка рассылки python .
Обратите внимание, что эта функция предназначена для помещения файлов в почтовый архив с либо нет родительского каталога или только один родительский каталог, поэтому он будет обрезать любой ведущие каталоги в путях файловой системы и не включать их в пути к zip-архивам. Это обычно тот случай, когда вы хотите просто взять каталог и превратить его в ZIP-файл, который можно извлечь в разные местах.
Аргументы ключевого слова:
dirPath - строковый путь к каталогу для архивирования. Это единственный обязательный аргумент. Может быть абсолютным или относительным, но только один или ноль ведущие каталоги будут включены в zip-архив.
zipFilePath - строковый путь к выходному zip-файлу. Это может быть абсолютным или относительный путь. Если zip-файл уже существует, он будет обновлен. Если нет, он будет создан. Если вы хотите заменить его с нуля, удалите его до вызова этой функции. (по умолчанию вычисляется как dirPath + ".zip")
includeDirInZip - логическое значение, указывающее, должен ли каталог верхнего уровня быть включены в архив или опущены. (по умолчанию True)
(обратите внимание, что StackOverflow, похоже, не в состоянии распечатать мой python с строки в тройных кавычках, поэтому я просто преобразовал свои строки документа в текст сообщения)
#!/usr/bin/python
import os
import zipfile
def zipdir(dirPath=None, zipFilePath=None, includeDirInZip=True):
if not zipFilePath:
zipFilePath = dirPath + ".zip"
if not os.path.isdir(dirPath):
raise OSError("dirPath argument must point to a directory. "
"'%s' does not." % dirPath)
parentDir, dirToZip = os.path.split(dirPath)
#Little nested function to prepare the proper archive path
def trimPath(path):
archivePath = path.replace(parentDir, "", 1)
if parentDir:
archivePath = archivePath.replace(os.path.sep, "", 1)
if not includeDirInZip:
archivePath = archivePath.replace(dirToZip + os.path.sep, "", 1)
return os.path.normcase(archivePath)
outFile = zipfile.ZipFile(zipFilePath, "w",
compression=zipfile.ZIP_DEFLATED)
for (archiveDirPath, dirNames, fileNames) in os.walk(dirPath):
for fileName in fileNames:
filePath = os.path.join(archiveDirPath, fileName)
outFile.write(filePath, trimPath(filePath))
#Make sure we get empty directories as well
if not fileNames and not dirNames:
zipInfo = zipfile.ZipInfo(trimPath(archiveDirPath) + "/")
#some web sites suggest doing
#zipInfo.external_attr = 16
#or
#zipInfo.external_attr = 48
#Here to allow for inserting an empty directory. Still TBD/TODO.
outFile.writestr(zipInfo, "")
outFile.close()
Вот несколько примеров использования. Обратите внимание, что если ваш аргумент dirPath имеет несколько ведущих каталогов, по умолчанию будет включен только последний. Передайте includeDirInZip = False, чтобы пропустить все ведущие каталоги.
zipdir("foo") #Just give it a dir and get a .zip file
zipdir("foo", "foo2.zip") #Get a .zip file with a specific file name
zipdir("foo", "foo3nodir.zip", False) #Omit the top level directory
zipdir("../test1/foo", "foo4nopardirs.zip")
вот моя функция, которую я использую для архивирования папки:
import os
import os.path
import zipfile
def zip_dir(dirpath, zippath):
fzip = zipfile.ZipFile(zippath, 'w', zipfile.ZIP_DEFLATED)
basedir = os.path.dirname(dirpath) + '/'
for root, dirs, files in os.walk(dirpath):
if os.path.basename(root)[0] == '.':
continue #skip hidden directories
dirname = root.replace(basedir, '')
for f in files:
if f[-1] == '~' or (f[0] == '.' and f != '.htaccess'):
#skip backup files and all hidden files except .htaccess
continue
fzip.write(root + '/' + f, dirname + '/' + f)
fzip.close()
Thank you wery much for this useful function! I found it very useful as I was also searching for help. However, maybe it would be useful to change it a little bit so that
basedir = os.path.dirname(dirpath) + '/'
would be
basedir = os.path.dirname(dirpath + '/')
Because found that if I want to zip folder 'Example' which is located at 'C:\folder\path\notWanted\to\zip\Example',
I got in Windows:
dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example/'
dirname = 'C:\folder\path\notWanted\to\zip\Example\Example\Subfolder_etc'
But I suppose your code should give
dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example\'
dirname = '\Subfolder_etc'