如何解压缩相同子目录但不同文件夹中的文件
Posted
技术标签:
【中文标题】如何解压缩相同子目录但不同文件夹中的文件【英文标题】:How to unzip files in the same subdirectories but a different folder 【发布时间】:2020-11-19 14:00:59 【问题描述】:在my_directory
我有 3 个文件夹(NY、AMS、MAD)。每个文件夹有 1 个或多个压缩文件。我还有一个名为my_counterpart
的目录。这个是空的。
我尝试使用以下代码:
-
收集所有 3 个文件夹及其拥有的压缩文件。
将这3个文件夹复制到
my_counterpart
+ 解压它们拥有的文件`。
这是我的代码:
pattern = '*.zip'
for root, dirs, files in os.walk(my_directory):
for filename in fnmatch.filter(files, pattern):
path = os.path.join(root, filename)
new = os.path.join(my_counterpart, dirs)
zipfile.ZipFile(path).extractall(new)
我知道问题出在哪里,dirs
不是字符串而是列表。但是我似乎无法解决它。有人可以指导我吗?
TypeError: join() argument must be str or bytes, not 'list'
【问题讨论】:
【参考方案1】:变量my_counterpart
是否包含新文件夹的路径?如果是,那你为什么要添加其他东西,比如dirs
?离开它已经做了你想要它做的事情。剩下要做的是创建文件夹结构并提取到新创建的文件夹结构中:
pattern = '*.zip'
for root, dirs, files in os.walk(my_directory):
for filename in fnmatch.filter(files, pattern):
path = os.path.join(root, filename)
# Store the new directory so that it can be recreated
new_dir = os.path.normpath(os.path.join(os.path.relpath(path, start=my_directory), ".."))
# Join your target directory with newly created directory
new = os.path.join(my_counterpart, new_dir)
# Create those folders, works even with nested folders
if (not os.path.exists(new)):
os.makedirs(new)
zipfile.ZipFile(path).extractall(new)
【讨论】:
my_counterpart
只是一个空目录的路径。它不包含my_directory
中包含的子目录。现在您的代码只是在my_counterpart
中提取它们,而不是在目录中(应该首先创建)
编辑以全面回答您的问题
看起来不错,只有 1 个问题。 my_directory
中的某些文件夹包含超过 1 个压缩文件。这意味着它试图再次创建同一个文件夹......所以当它到达一个包含多个文件的目录时,它会说:FileExistsError: [WinError 183] Cannot create a file when that file already exists
。希望你能理解。
在创建之前检查目录是否已经存在,将if
添加到我的答案中
谢谢各位。我想解决一件事。我想通过在文件名中添加 ---> date_of_file = re.search('-(.\d+)-', file).group(1)
来重命名文件。压缩文件包含一个日期,但解压缩后该日期会被删除。这就是我想添加它的原因。以上是关于如何解压缩相同子目录但不同文件夹中的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 压缩/解压缩文件夹及其所有文件和子目录?