当我在 Linux 中使用 python 提取 zip 文件时出现目录相关问题,其中 zip 在 window 系统中使用 java 8 创建
Directory related issue while I am extracting zip file using python inside Linux where zip created in window system using java 8
**我有一个包含一些文件和子目录的文件夹,其中也有一些文件。
但是当我使用以下 python 代码在 Linux 系统中提取 zip 文件时。它不是创建子目录,而是创建名称包含带分隔符的子目录名称的文件,其中我在 window 系统中使用 java 语言通过以下代码创建的那个 zip 文件。
示例:ABC.zip 文件包含 abc.txt,子文件夹名称 ABCD,此 ABCD 文件夹包含一个文件名称 test.txt
然后在 python 中,当我提取时,它会创建两个名称为 abc.txt、ABCD\text.txt 的文件,而不是 ABCD 文件夹,然后在 ABCD text.txt 文件中创建**
Python 边码:解压zip文件
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)
Java 边码:创建 zip 文件
String srcDir = "E:\tomcat\ai_data\3";
File file = new File(srcDir);
File desFile = new File(srcDir.concat(".zip"));
final Path sourceDir = Paths.get(srcDir);
String zipFileName = srcDir.concat(".zip");
try {
final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
try {
Path targetFile = sourceDir.relativize(file);
outputStream.putNextEntry(new ZipEntry(targetFile.toString()));
byte[] bytes = Files.readAllBytes(file);
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.closeEntry();
} catch (IOException e) {
LOGGER.error("Create Zip file " + file.getFileName(), e.getMessage());
}
return FileVisitResult.CONTINUE;
}
});
outputStream.close();
} catch (IOException e) {}
问题似乎是 Java 代码使用 Windows 分隔符样式 (\) 创建 zip 文件条目,然后 python 代码发现文件包含( \ ) 并认为是名称的一部分,因为它期望 ( / ) 作为路径分隔符。如果 java 代码总是要创建一个要在 linux 系统上提取的 zip 文件,请尝试将 zip 条目的文件路径转换为使用 Linux 分隔符,例如:
Path targetFile = sourceDir.relativize(file);
//Convert seperators to Linux Style
String linuxStylePath = FilenameUtils.seperatorsToUnix(targetFile.toString());
outputStream.putNextEntry(new ZipEntry(linuxStylePath));
参考Apache Commons IO Library进行路径转换。
**我有一个包含一些文件和子目录的文件夹,其中也有一些文件。 但是当我使用以下 python 代码在 Linux 系统中提取 zip 文件时。它不是创建子目录,而是创建名称包含带分隔符的子目录名称的文件,其中我在 window 系统中使用 java 语言通过以下代码创建的那个 zip 文件。
示例:ABC.zip 文件包含 abc.txt,子文件夹名称 ABCD,此 ABCD 文件夹包含一个文件名称 test.txt 然后在 python 中,当我提取时,它会创建两个名称为 abc.txt、ABCD\text.txt 的文件,而不是 ABCD 文件夹,然后在 ABCD text.txt 文件中创建**
Python 边码:解压zip文件
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)
Java 边码:创建 zip 文件
String srcDir = "E:\tomcat\ai_data\3";
File file = new File(srcDir);
File desFile = new File(srcDir.concat(".zip"));
final Path sourceDir = Paths.get(srcDir);
String zipFileName = srcDir.concat(".zip");
try {
final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
try {
Path targetFile = sourceDir.relativize(file);
outputStream.putNextEntry(new ZipEntry(targetFile.toString()));
byte[] bytes = Files.readAllBytes(file);
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.closeEntry();
} catch (IOException e) {
LOGGER.error("Create Zip file " + file.getFileName(), e.getMessage());
}
return FileVisitResult.CONTINUE;
}
});
outputStream.close();
} catch (IOException e) {}
问题似乎是 Java 代码使用 Windows 分隔符样式 (\) 创建 zip 文件条目,然后 python 代码发现文件包含( \ ) 并认为是名称的一部分,因为它期望 ( / ) 作为路径分隔符。如果 java 代码总是要创建一个要在 linux 系统上提取的 zip 文件,请尝试将 zip 条目的文件路径转换为使用 Linux 分隔符,例如:
Path targetFile = sourceDir.relativize(file);
//Convert seperators to Linux Style
String linuxStylePath = FilenameUtils.seperatorsToUnix(targetFile.toString());
outputStream.putNextEntry(new ZipEntry(linuxStylePath));
参考Apache Commons IO Library进行路径转换。