使用 Python 提取文件名中含有无效字符的文件
我使用 python 的 zipfile 模块提取 .zip 存档(让我们在 http://img 获取此文件例如.dafont.com/dl/?f=akvaleir。)
f = zipfile.ZipFile('akvaleir.zip', 'r')
for fileinfo in f.infolist():
print fileinfo.filename
f.extract(fileinfo, '.')
其输出:
Akval�ir_Normal_v2007.ttf
Akval�ir, La police - The Font - Fr - En.pdf
两个文件在提取后都无法访问,因为它们的文件名中存在无效的编码字符。问题是 zipfile 模块没有指定输出文件名的选项。
但是,“unzip akvaleir.zip”很好地转义了文件名:
root@host:~# unzip akvaleir.zip
Archive: akvaleir.zip
inflating: AkvalВir_Normal_v2007.ttf
inflating: AkvalВir, La police - The Font - Fr - En.pdf
我尝试在 python 程序中捕获“unzip -l akvaleir.zip”的输出,这两个文件名是:
Akval\xd0\x92ir_Normal_v2007.ttf
Akval\xd0\x92ir, La police - The Font - Fr - En.pdf
如何在不捕获的情况下获得正确的文件名,就像 unzip 命令所做的那样“unzip -l akvaleir.zip”的输出?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
虽然花了一些时间,但我想我找到了答案。
我猜想这个词应该是 Akvaléir。我找到了有关此内容的法语页面描述。当我使用你的代码片段时,我有一个类似 That 的字符串
不适用于 UTF8、Latin-1、CP-1251 或 CP-1252 编码。然后我发现 CP863 可能是加拿大编码,因此可能来自法语加拿大。
但是,我随后阅读了 Zip 文件格式规范,其中写着
测试结果给了我与加拿大代码页相同的答案
我没有 Unicode 编码的 zip 文件,并且我不会创建一个来找出答案,所以我假设所有 zip 文件都具有 cp437 编码。
在我的 Mac 上,它给出了
哪个选项卡完成
并在我的文件浏览器中显示为一个漂亮的“é”。
It took some time but I think I found the answer.
I assumed the word was supposed to be Akvaléir. I found a page description about that, in French. When I used your code snippet I had a string like
That didn't work at UTF8, Latin-1, CP-1251 or CP-1252 encodings. I then found that CP863 was a possible Canadian encoding, so perhaps this was from French Canada.
However, I then read the Zip file format specification which says
Testing that out gives me the same answer as the Canadian code page
I don't have a Unicode encoded zip file and I'm not going to create one to find out, so I'll just assume that all zip files have the cp437 encoding.
On my Mac that gives
which tab-completes to
and shows up with a nice 'é' in my file browser.
使用 extract 方法"noreferrer">
open
方法并将生成的伪文件以您希望的任何名称保存到磁盘,例如使用shutil.copyfileobj
。Instead of the
extract
method, use theopen
method and save the resulting pseudofile to disk under whatever name you wish, for example withshutil.copyfileobj
.我在使用 Docker 运行应用程序时遇到了类似的问题。将此行添加到 Dockerfile 中,为我解决了所有问题:
所以,我想如果您不使用 Docker,请尝试一下并确保正确生成和设置语言环境。
I ran into a similar issue while running my application using Docker. Adding this lines to the Dockerfile, fixed everything for me:
So, I guess if you're not using Docker, give it a try and make sure locales are properly generated and set.