压缩文件并保存到特定文件夹
Zip file and save to specific folder
这可能是一个愚蠢的问题,但我一直在努力寻找解决方案。
所以我在给定的文件夹中有一个文件:
Output190101_0100190101_0100.csv
现在我想压缩文件并将其保存到同一位置。所以这是我的尝试:
zipfile.ZipFile('Output/20190101_0100/20190101_0100_11.zip', mode='w', compression=zipfile.ZIP_DEFLATED).write('Output/20190101_0100/20190101_0100_11.csv')
但是是制作一个文件夹insider zip文件夹并保存,如下图:
Output190101_0100190101_0100_11.zip\Output190101_0100190101_0100_11.csv
谁能告诉我如何将我的文件直接保存在同一位置或下面提到的位置:
Output190101_0100190101_0100_11.zip190101_0100_11.csv
您可以尝试使用原始路径:
zipfile.ZipFile('Output/20190101_0100/20190101_0100_11.zip', mode='w', compression=zipfile.ZIP_DEFLATED).write(r'C:\...\Output190101_0100190101_0100_11.csv')
改写问题
这个问题有点令人困惑,因为 Output190101_0100190101_0100_11.zip\Output190101_0100190101_0100_11.csv
不是一个文件,而是 Output190101_0100190101_0100_11.csv
是压缩文件 Output190101_0100190101_0100_11.zip
中的一个文件(如果我没记错的话)
只是重申你的问题(如果我理解正确的话):
- 您有一个文件
Output190101_0100190101_0100.csv
(Output
-> 20190101_0100
子目录中的一个文件 20190101_0100.csv
)
- 您要创建 zip 文件
Output/20190101_0100/20190101_0100_11.zip
(20190101_0100_11.zip
在 Output
-> 20190101_0100.zip
目录中)
- 您想添加上述 CSV 文件
Output190101_0100190101_0100.csv
但没有前导路径,即 20190101_0100_11.csv
而不是 Output190101_0100190101_0100.csv
。
或者为了不与太多相似的目录混淆,我们将其简化为:
- 您在子目录
sub-folder
中有一个文件 test.csv
- 您要创建 zip 文件
test.zip
- 您想添加上述 CSV 文件
test.csv
但没有前导路径,即 test.csv
而不是 sub-folder/test.csv
。
回答
来自 ZipFile.write 文档:
Write the file named filename to the archive, giving it the archive
name arcname (by default, this will be the same as filename, but
without a drive letter and with leading path separators removed).
这意味着 arcname
将默认为传入的 filename
(它没有驱动器号或前导路径分隔符)。
如果要删除子文件夹部分,只需传入arcname
即可。例如:
import zipfile
with zipfile.ZipFile('path-to-zip/test.zip', 'w') as zf:
zf.write('sub-folder/test.csv', arcname='test.csv')
这可能是一个愚蠢的问题,但我一直在努力寻找解决方案。
所以我在给定的文件夹中有一个文件:
Output190101_0100190101_0100.csv
现在我想压缩文件并将其保存到同一位置。所以这是我的尝试:
zipfile.ZipFile('Output/20190101_0100/20190101_0100_11.zip', mode='w', compression=zipfile.ZIP_DEFLATED).write('Output/20190101_0100/20190101_0100_11.csv')
但是是制作一个文件夹insider zip文件夹并保存,如下图:
Output190101_0100190101_0100_11.zip\Output190101_0100190101_0100_11.csv
谁能告诉我如何将我的文件直接保存在同一位置或下面提到的位置:
Output190101_0100190101_0100_11.zip190101_0100_11.csv
您可以尝试使用原始路径:
zipfile.ZipFile('Output/20190101_0100/20190101_0100_11.zip', mode='w', compression=zipfile.ZIP_DEFLATED).write(r'C:\...\Output190101_0100190101_0100_11.csv')
改写问题
这个问题有点令人困惑,因为 Output190101_0100190101_0100_11.zip\Output190101_0100190101_0100_11.csv
不是一个文件,而是 Output190101_0100190101_0100_11.csv
是压缩文件 Output190101_0100190101_0100_11.zip
中的一个文件(如果我没记错的话)
只是重申你的问题(如果我理解正确的话):
- 您有一个文件
Output190101_0100190101_0100.csv
(Output
->20190101_0100
子目录中的一个文件20190101_0100.csv
) - 您要创建 zip 文件
Output/20190101_0100/20190101_0100_11.zip
(20190101_0100_11.zip
在Output
->20190101_0100.zip
目录中) - 您想添加上述 CSV 文件
Output190101_0100190101_0100.csv
但没有前导路径,即20190101_0100_11.csv
而不是Output190101_0100190101_0100.csv
。
或者为了不与太多相似的目录混淆,我们将其简化为:
- 您在子目录
sub-folder
中有一个文件 - 您要创建 zip 文件
test.zip
- 您想添加上述 CSV 文件
test.csv
但没有前导路径,即test.csv
而不是sub-folder/test.csv
。
test.csv
回答
来自 ZipFile.write 文档:
Write the file named filename to the archive, giving it the archive name arcname (by default, this will be the same as filename, but without a drive letter and with leading path separators removed).
这意味着 arcname
将默认为传入的 filename
(它没有驱动器号或前导路径分隔符)。
如果要删除子文件夹部分,只需传入arcname
即可。例如:
import zipfile
with zipfile.ZipFile('path-to-zip/test.zip', 'w') as zf:
zf.write('sub-folder/test.csv', arcname='test.csv')