banner
肥皂的小屋

肥皂的小屋

github
steam
bilibili
douban
tg_channel

將文件名中的中文數字轉換為阿拉伯數字

事情起因#

從某公眾號得到 micropoor (亮神) 大佬的滲透教程,源地址 (需翻牆):https://micropoor.blogspot.com/2019/01/php8.html

(19-02-23 更新) 亮神也在 Github 上更新著,這個是最全的,同樣可以使用本文腳本重命名保持順序:https://github.com/Micropoor/Micro8,soapffz 在 gitee 同步了這個項目,參考文章:[git clone 太慢?用碼雲做中轉站優雅提速 (因為失敗而變成了一篇水文) ]1

可直接使用:

git clone https://gitee.com/soapffz/Micro8.git

下載,看雪論壇 micropoor 大大也在更新一部分:https://www.kanxue.com/book-section_list-38.htm

image

但是看到文件名的排序是 “第 xx 課” 這樣的,不利於我們排序,所以我們準備把它這樣批量修改:

比如將 “msf 的前生今世(第三十一課).pdf” 重命名為 “31-msf 的前生今世.pdf”

代碼實現#

提取課程排序中文數字#

首先我們要把中文的第幾課提取出來,用 re 正則表達式庫:

import re
cc = 'msf的前生今世(第三十一課).pdf'
r1 = re.compile(u'[一二三四五六七八九十]{1,}')
print(r1.findall(cc))

image

可以看到已經提取出來

提取課程名字#

參考鏈接:https://www.cnblogs.com/lzhc/p/8744299.html

我們要把除了排序的中文數字的部分提取出來,也就是把大括號及裡面的文字去掉:

import re
cc = 'msf 的前生今世(第三十一課).pdf'
a = re.sub(u"\\(.\*?)","",cc)
print(a)

輸出結果:msf的前生今世.pdf

將中文數字轉換為阿拉伯數字#

參考文章:https://segmentfault.com/a/1190000013048884

考慮以下幾點:

1. 零在中文數字串中起補位作用,處理的時候可以忽略掉 2. 一十通常直接縮減為十,意味著十前獲取不到數字時為一十 3. 單位千、百、十前的數為單個數字 4. 單位萬前的數可以由(3)複合而成 5. 單位億前的數可以由(3)、(4)及億本身複合而成

代碼實現:

digit = {'一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9}

def \_trans(s):
num = 0
if s:
idx*q, idx_b, idx_s = s.find('千'), s.find('百'), s.find('十')
if idx_q != -1:
num += digit[s[idx_q - 1:idx_q]] * 1000
if idx*b != -1:
num += digit[s[idx_b - 1:idx_b]] * 100
if idx_s != -1: # 十前忽略一的處理
num += digit.get(s[idx_s - 1:idx_s], 1) \* 10
if s[-1] in digit:
num += digit[s[-1]]
return num

def trans(chn):
chn = chn.replace('零', '')
idx*y, idx_w = chn.rfind('億'), chn.rfind('萬')
if idx_w < idx_y:
idx_w = -1
num_y, num_w = 100000000, 10000
if idx_y != -1 and idx_w != -1:
return trans(chn[:idx_y]) * num*y + \_trans(chn[idx_y + 1:idx_w]) * num*w + \_trans(chn[idx_w + 1:])
elif idx_y != -1:
return trans(chn[:idx_y]) * num*y + \_trans(chn[idx_y + 1:])
elif idx_w != -1:
return \_trans(chn[:idx_w]) * num_w + \_trans(chn[idx_w + 1:])
return \_trans(chn)

測試

print(trans('十'))
print(trans('六百五十四'))
print(trans('五十六萬零一十'))
print(trans('一億九千三百五十二萬六千七百五十四'))
print(trans('一百萬億零七'))

image

代碼彙總#

參考文章:https://www.cnblogs.com/kba977/p/3533367.html

# !/usr/bin/python

# - _ - coding:utf-8 - _ -

'''
@author: soapffz
@fucntion: 轉換文件名中的中文數字為阿拉伯數字
@Description: 比如將“msf 的前生今世(第三十一課).pdf”重命名為“31-msf 的前生今世.pdf”
@time: 2019-02-06
'''

import os
import re

digit = {'一': 1, '二': 2, '三': 3, '四': 4,
'五': 5, '六': 6, '七': 7, '八': 8, '九': 9}

def \_trans(s):
num = 0
if s:
idx*q, idx_b, idx_s = s.find('千'), s.find('百'), s.find('十')
if idx_q != -1:
num += digit[s[idx_q - 1:idx_q]] * 1000
if idx*b != -1:
num += digit[s[idx_b - 1:idx_b]] * 100
if idx_s != -1:
num += digit.get(s[idx_s - 1:idx_s], 1) \* 10
if s[-1] in digit:
num += digit[s[-1]]
return num

def trans(chn):
chn = chn.replace('零', '')
idx*y, idx_w = chn.rfind('億'), chn.rfind('萬')
if idx_w < idx_y:
idx_w = -1
num_y, num_w = 100000000, 10000
if idx_y != -1 and idx_w != -1:
return trans(chn[:idx_y]) * num*y + \_trans(chn[idx_y + 1:idx_w]) * num*w + \_trans(chn[idx_w + 1:])
elif idx_y != -1:
return trans(chn[:idx_y]) * num*y + \_trans(chn[idx_y + 1:])
elif idx_w != -1:
return \_trans(chn[:idx_w]) * num_w + \_trans(chn[idx_w + 1:])
return \_trans(chn)

if **name** == "**main**":
for filename in os.listdir("."): # print(filename)
split = filename.split(".") # 將文件名和綴名分成兩部分
if split[1] == 'pdf':
name = re.sub(u"\\(.\*?)", "", filename) # 正則表達式分別匹配出文件名和中文排序數字
cn_number = re.compile(u'[一二三四五六七八九十]{1,}').findall(filename)[-1::]
if cn_number: # 防止有些你已經手動轉換了
number = trans(cn_number[0])
new_filename = str(number) + "-" + name # print(new_filename)
os.rename(filename, new_filename)

效果如下:

image

但是如果直接在 micropoor 大佬的網站上或者在 lsh4ck 的網站上下載的文件名為這樣:

  • 第一百課:HTTP 隧道 reDuh 第四季.pdf
  • 第七十四課:基於白名單 regsvcs.exe 執行 payload 第四季.pdf

image

經測試,上面的代碼沒有考慮一百以上的中文數字,把主函數代碼改為如下即可:

if **name** == "**main**":
for filename in os.listdir("."): # print(filename)
portion = os.path.splitext(filename)
if portion[1] == '.pdf':
name = re.split(':', portion[0])[1]
cn_number = re.compile(
u'[一二三四五六七八九十零百千万億]{2,}').findall(portion[0])[0]
if cn_number:
number = trans(cn_number)
new_filename = str(number) + "-" + (name) + ".pdf" # print(new_filename)
os.rename(filename, new_filename)

自己可以對比下,只修改了一點點地方,效果如下:

image

不要把已經修改完的文件與未修改的放在一起執行腳本

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。