1
zhouzm 2015-09-23 10:01:52 +08:00
上白名单吧。
txt - yes b.txt - stop ---- txt gz - yes tar.gz - yes ... ---- tar.gz |
2
lanphon 2015-09-23 10:05:00 +08:00
.tar.gz 文件可以认为就是.gz 文件啊。。。
可以用 gzip 打开,得到一个 tar 文件 此外,如果需要一步认出 gzip 压缩过的 tar 归档文件,后缀应当是.tgz 此外的例子还有 tar.bz2 ,使用 bzip2 压缩过的 tar 归档文件 |
4
9hills 2015-09-23 10:10:09 +08:00 via iPhone
os.path.split
os.path.spiltext 有现成的标准库啊 |
5
lanphon 2015-09-23 10:14:57 +08:00
@9hills 刚试了, os.path.splitext 对付不了 a.tar.gz 这种 case
@wikinee 老老实实一步一步来吧,比如只处理最后一个后缀之后,尝试提取剩下文件名中的后缀,如果有效,则继续,无效,则返回 a.tar.gz -> a.tar ,提取后缀 tar ,有效 -> a ok a.b.txt -> a.b ,提取后缀 b ,无效 ->a.b 不过可能需要顺次保存后缀名的序列,以判断是否有效,此外还需要建立规则,例如 a.tar.gz 的后缀是 tar.gz ,但是 a.tar.txt 的后缀就只是 txt 了,因为 txt 没办法和 tar 组合 anyway ,后缀其实只是文件名标示的一部分,其实是可以随便改的,最佳的方法还是 parse 文件内容得到文件类型 |
6
gamexg 2015-09-23 10:20:09 +08:00
有标准库,即使自己实现也可以这样:
>>> 'a.tar.gz'.split('.',1) ['a', 'tar.gz'] |
7
gamexg 2015-09-23 10:24:58 +08:00
处理 a.tar.txt 这种?
根据自己的需求,仿 windows 识别文件类型的方法。例如确定是否为图片,就: >>> for i in ('.png','.jpg'): if 'a.tar.gz'.endswith(i): return True |
8
gamexg 2015-09-23 10:32:47 +08:00
好吧,需要一份文件类型列表:
>>> for i in sorted(['.tar.gz','.txt','.gz','.png','.jpg'],key=len,reverse=True): if 'a.tar.gz'.endswith(i): print i break .tar.gz |
9
wind4 2015-09-23 10:36:01 +08:00
www.v2ex.com.tar.gz
|
10
imn1 2015-09-23 10:38:23 +08:00
需要白名单
其实跟 分开 .com .com.cn .cn 一样 |
12
9hills 2015-09-23 11:28:48 +08:00
xxx.tar.gz 只是一个习惯。你完全可以用 xxx.tgz , xxx.gz 都是可以的
|
13
ratazzi 2015-09-23 11:58:30 +08:00
配合 mimetypes 得了
|
14
wikinee OP @zhouzm 感谢提供白名单思路
@gamexg @lanphon 感谢认真回复 #coding:utf-8 import os def rename_file(file_path,file_holder,file_reciever): #path 必须以 /开头 __author__ = 'wikinee' file_full_name=file_path.split("/")[-1] point1 = file_full_name.split(".") double_types=['tar.gz','tar.bz2','tar.bz','tar.Z'] if len(point1) <= 1: filetype = "" sp_filename = point1[0] new_name = file_holder+"_"+sp_filename+"_"+file_reciever elif len(point1) ==2: filetype=point1[-1] sp_filename = point1[0] new_name = file_holder+"_"+sp_filename+"_"+file_reciever+"."+filetype else: newtype = point1[-2]+"."+point1[-1] if newtype in double_types: sp_filename = os.path.splitext(os.path.splitext(file_full_name)[0])[0] @9hills 你说的是上面这句是这意思吗? filetype = newtype new_name = file_holder+"_"+sp_filename+"_"+file_holder+"."+filetype else: sp_filename = os.path.splitext(file_full_name)[0] filetype = point1[-1] new_name = file_holder+"_"+sp_filename+"_"+file_holder+"."+filetype return new_name |