要过节啦,下载了一批喜马拉雅的有声读物,准备放到SD卡里到车上听。到目录一瞧,嘿,都是些啥玩意。
├─323366
│      51937074.m4a
│      52070404.m4a
├─4756811
│      18556415.m4a
├─6729285
│      38100357.m4a
└─7651313
       50867022.m4a
我想要的是类似这样的目录和歌曲名
├─CCTV朗读者
│      朗读者特别节目丨王姬:致母亲“妈妈,下辈子请您做我的女儿。”.m4a
├─冷历史
│      一线业务代表怎样像白起一样做起来.m4a
│      职场上千万不要犯和白起一样的错.m4a
├─摸金天师(盗墓小说):紫襟故事
│      《摸金天师》第001章 百辟刀(求订阅,打赏!).m4a
└─晓说2017
       晓说第23期:口述历史对谈马未都(上)老北京寻宝记.m4a

研究一下喜马拉雅的下载目录,发现它把每的节目由两个描述性的jSON文件和存放文件的目录组成。举个例子更容易明白,对上面的323366,
323366:
1) 322266info.json,节目描述文件
323366info.json描述了节目信息,其中主要的是"Title",表示节目名,“冷历史”;
2) 323366list.json
323366list.json表示节目里包含的曲目名,是一个JSON数组,每个表示一个曲目。list文件的第一个“Title”=“职场上千万不要犯和白起一样的错”
这玩意下载的多了,没法手动去逐个改,还不得累死我这老胳膊老腿的。所以决定写个Python程序,来完成这个任务。
这是我写的第二个python程序,所以坑还真不少,有得坑跟喜马拉雅有关。简单列一些,供以后参考。
1. 编码坑

之前就掉进python的坑里,好不容易爬出来,以为都应该明白了呢。现实总是残酷的多,要解析JSON文件,总得先读进来吧,如下:
with open("323366info.json",'r') as load_f:
   load_dict = json.load(load_f)    
   print(load_dict["title"])
总是在load这句,报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xb2 in position 93: illegal multibyte sequence
即使在load里加入了“encoding=”utf-8””。以为又是cmd窗口的问题, 用chcp修改了代码页,无济于事。
仔细研究,发现open默认按字符方式打开,这时其实有一个编码隐含在这里,我的Windows系统是中文版,默认编码是GBK,Python3应该是取了这个默认值,所以修改CMD窗口无济于事。

了解了来龙去脉,修改就简单了,只需将第一句话修改成:
with open("323366info.json",'r',encoding = "utf-8") as load_f:

2. 正则表达式坑
喜马拉雅的Title是用户上传的,所以Title里包含什么都不奇怪。但Windows目录名是有禁忌的,下面这些字符都不可以出现在文件和目录名中:
/\:*?"<>|]
可以管这些叫咒符,自然的想法就是遇到这些咒符,就查一下替换掉。
等一下,这不就是正则表达式擅长的吗,虽然没怎么用过,我还是决定试一试这高级玩意。
“\”,“:”,“?”,“|”,这些都是正则表达式的元字符,应该需要转义,但也有文档说,如果包含在“[...]"内,应该不需要,但实际上报错,还好可以在交互窗口中逐个试,最后发现应该写成这样才可以:
illegal_Char = re.compile(r"[/\\:*?\"<>|]")
也就是只有“\”和“"”需要转义,从道理上倒也讲得通,解释器找到“"”就认为这一个语句结束了,为什么不能说的更清楚些呢。
3. 喜马拉雅的同名节目坑
同一个节目目录下,居然有曲目完全同名。虽然知道喜马拉雅号称UGC(用户生成内容),但不能这么坑吧。
没办法,解决方法是,从xxxlist.json里找到了“ID”字段,不同曲目可能完全同名,但ID一定是不同的,如果遇到重名的,则给后出现的曲目加一个xxxxx的部分,比如如下罗辑思维的例子:
|
├─你是巨婴吗x[罗辑思维]No·198
├─你因挣钱而伟大 [罗辑思维]No.117
├─你因挣钱而伟大 [罗辑思维]No.1176585108
4. UTF-8与GBK的坑

对单字节高于0x80的字符,Unicode是支持的。比如,一些节目的Title里包含“-”字符,注意这里的“-”不是键盘上那个,而是在扩展ASCII里,这个被编码为0xA0,UTF-8编码为0xC2 A0,奇怪的是,GBK不支持这个字符,或者说python的decode函数不支持,所以总是报encoding error。后来发现可以先主动转一遍,对无法转换的字符,指定Ignore,则可以跳过.
print(old,"==>", new.encode("gbk","ignore").decode("gbk"))
差不多了,这些坑踩了个遍,我得第二个python程序可以正常工作了,我的国庆有声读物下载的也差不多了,有1700多个,运行一遍,10秒钟全部改完了。嗯,还不错。
贴上其中的一个关键函数,完整程序有需要者可以找我要
def ren_files(dir):
 updir = os.getcwd()
 
 subdir =  ".\\"+dir 
 
 os.chdir(subdir)
 
 print(os.getcwd())
 
 
 #####修改文件#####
 #获取上级目录下的list文件,是个多维JSON,包括了目录下所有节目信息
 infofilepath = updir + "\\" + dir + "list.json"
 
 #print(infofilepath)
 
 infofile = open(infofilepath,'r',encoding = "utf-8")
 playlist = json.load(infofile)
 
 #print(playlist)  
 #print(len(playlist)) 
   
 for i in range(len(playlist)):
   old =  str(playlist[i]["id"]) + ".m4a"
   new = playlist[i]["title"] + ".m4a" 
   
   new = re.sub(illegal_Char,"x",new)
   
   #同一目录下会有同名文件,奇葩的喜马拉雅
   if (os.path.exists(new)):
     new = new = playlist[i]["title"] + str(playlist[i]["trackId"]) + ".m4a"
     new = re.sub(illegal_Char,"x",new)
   
   #print总是要按控制台的默认编码打印,有些节目名包含“0xc2a0”这个字符,是特殊的“-”符号,
   #GBK无法编码这个字符,所以我们这里先主动编码一下,对无法解释的字符选择ignore,然后解码,
   print(old,"==>", new.encode("gbk","ignore").decode("gbk"))
   
   os.rename(old, new);    
 
 infofile.close()  
 #####修改文件结束#####  
 
 os.chdir(updir)
 
 #####修改目录名#####
 
 infofilepath = updir + "\\" + dir + "info.json" 
 print(infofilepath)
 
 infofile = open(infofilepath,'r',encoding = "utf-8")
 playlist = json.load(infofile)
 
 old =  dir  
 new = playlist["title"] 
   
 new = re.sub(illegal_Char,"x",new)
   
 print("dir: ",old,"==>", new)
 os.rename(old, new);
   
 infofile.close()    
   
 #####修改目录名结束#####
 
 return

批量修改喜马拉雅下载节目的文件名相关推荐

  1. 源码:批量修改喜马拉雅下载节目的文件名

    长久未登录CSDN了,发现之前的博文,批量修改喜马拉雅下载节目的文件名下有很多朋友留言,需要代码的人很多,看来有困难的人还不少. 在此,贴出代码,有需要的朋友可以下载使用. 用法: cd 下载目录 ( ...

  2. 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件

    1.  自动批量修改文件后缀名,有时非常有用. 对于文件名没有要求,不用是序列文件名.比如需要将abaqus的inp文件修改成txt文件,便于使用 textscan和 textread等函数操作. c ...

  3. 【精华】批量修改文件夹中的文件名

    转载自[批量修改文件名] 原文地址如下:http://t.csdn.cn/tGsfz 1.在所需批量修改文件名的文件夹内新建一个改.txt文件,并在新建的txt文件中输入dir> 1.txt 2 ...

  4. java批量修改指定目录下的文件名

    package io; import java.io.File; import java.io.IOException;/*** @Auther: Code* @Date: 2018/9/9 18:0 ...

  5. 批量修改多目录下相同文件名的文件内容

    目前的情况: 在/data/test/目录中,有很多子目录,每个子目录中都包括一个文件名为"HD"的文件 现在想把所有的HD文件的内容修改成统一的内容,比如"0" ...

  6. 【Python】批量修改照片文件名为拍摄日期

    更新2022.09.09 代码已经大幅更新,需要的同学可以去这篇博客自取. 更新 2021.05.07 合并了修改照片的拍摄日期和文件名功能,请看:批量修改照片的拍摄日期和文件名 需求 最近整理老照片 ...

  7. 【Python】批量修改照片日期

    更新2022.09.09 代码已经大幅更新,需要的同学可以去这篇博客自取. 更新 2021.05.07 合并了修改照片的拍摄日期和文件名功能,请看:批量修改照片的拍摄日期和文件名 需求 最近整理老照片 ...

  8. Python自动批量修改文件名称的方法大全

    前言 本文介绍基于Python语言,按照一定命名规则批量修改多个文件的文件名的方法.已知现有一个文件夹,其中包括班级所有同学上交的作业文件,每人一份:所有作业文件命名格式统一,都是地信1701_姓名_ ...

  9. ant批量修改文件名_Ant Renamer|Ant Renamer(文件名批量改名软件)中文免费版v2.12 下载_当游网...

    Ant Renamer可以批量修改文件的名字,可随机生成文件名,或者是修改字符串进行替换移动等操作,操作简单,还有多种语言可以选择,快来下载吧. 软件介绍 Ant Renamer(免费批量重命名工具) ...

  10. ant批量修改文件名_Ant Renamer-Ant Renamer(免费批量重命名工具)下载 v2.12官方版--pc6下载站...

    AntRenamer免费批量重命名工具支持Unicode文件名WindowsNT版本-2000XPVista和7,字符串插入,编号,更改扩展名,用其他字符替换字符串,大小写变化,随机名称创建,正则表达 ...

最新文章

  1. MySQL 修改账号的IP限制条件
  2. 实现3d图片移动_ThingJS官方示例(三):3D标记Marker动效定制化
  3. Android中发送和接收短信
  4. sql like 绑定变量_码硬解析的改进方法之二使用绑定变量
  5. java rc2加密_急求java RC2加密算法
  6. .net框架读书笔记---CLR内存管理\垃圾收集(二)
  7. android 资料文档共享
  8. my97DatePicker 自定义扩展方法(实现备忘录)
  9. (三)SpringMVC实现
  10. 软件测试 学习之路 CSS (三)
  11. 【iOS】iOS开发编码规范小结
  12. 我的R 之路: R最常见的小基础。。。。。。。。
  13. C C++回调函数和java的回调函数
  14. 4.1 NI-USRP简介
  15. 如何通过Homography矩阵制作虚拟图像
  16. VC707开发板的IIC控制
  17. CSS篇-dbMovies和dbBooks小网页
  18. 梅科尔工作室-李庆浩 深度学习 KNN算法与SVM算法
  19. 交出2021年进步答卷,挚文集团如何做到稳中求进?
  20. Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符

热门文章

  1. 期末作业代码网页设计代码——蛋糕甜品店铺(11页) HTML+CSS+JavaScript 关于美食甜品的HTML网页设计
  2. 省市区三级联动数据库
  3. 凤凰系统无法更新play服务器,凤凰OS:麦克风设置的问题
  4. ccna、ccnp视频教程
  5. 学校计算机房要求,学校机房建设包含哪些内容以及相关的标准(参考)一
  6. IBM OmniFind Enterprise Starter Edition
  7. 极客技术专题【002期】:开发小技巧 - 如何使用jQuery来处理图片坏链?
  8. 使用SCM管理jenkinsfile
  9. 罗树忠老师 银行高端客户运营与管理专家
  10. 红米k50 至尊版 解锁bl 获取root教程步骤