【发布时间】:2014-10-22 01:27:10
【问题描述】:
我想编写一个脚本来将所有“.py”文件添加到一个 zip 文件中。
这是我所拥有的:
import zipfile
import os
working_folder = 'C:\\Python27\\'
files = os.listdir(working_folder)
files_py = []
for f in files:
if f[-2:] == 'py':
fff = working_folder + f
files_py.append(fff)
ZipFile = zipfile.ZipFile("zip testing.zip", "w" )
for a in files_py:
ZipFile.write(a, zipfile.ZIP_DEFLATED)
但是它给出了一个错误:
Traceback (most recent call last):
File "C:\Python27\working.py", line 19, in <module>
ZipFile.write(str(a), zipfile.ZIP_DEFLATED)
File "C:\Python27\lib\zipfile.py", line 1121, in write
arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
File "C:\Python27\lib\ntpath.py", line 125, in splitdrive
if p[1:2] == ':':
TypeError: 'int' object has no attribute '__getitem__'
看来给定的文件名不正确。
【问题讨论】:
-
简单说明,使用 os.path.join(working_folder, f) 生成真实路径,不要直接使用字符串拼接'+'
-
@MarkK: 使用
os.path(),您的代码可以更轻松地跨平台,因为库会处理正确的路径分隔符。您也不必太在意在working_folder末尾提供路径分隔符。 -
@MarkK:在同一张纸条上,您可以使用
str.endswith()代替切片:if f.endswith('.py'):。 -
@MarkK: 和
ZipFile不需要将任何内容收集到一个文件夹中。您可以给它任何文件列表,然后提供第二个arcname参数来指定存档中的文件名(带路径)。例如,os.path.basename()可以将所有文件放在一个平面层次结构中。 -
@MarkK 正如马丁大师所说:D 你的代码将是跨平台的,它不会破坏你在 windows 或 linux 上运行,也比直接处理字符串更好,因为你不不必添加额外的检查。检查 os.path 函数的文档,您会在那里找到一些很棒的信息,干杯!