python實(shí)現(xiàn)word文檔批量轉(zhuǎn)成自定義格式的excel文檔的思路及實(shí)例代碼
支持按照文件夾去批量處理,也可以單獨(dú)一個(gè)文件進(jìn)行處理,并且可以自定義標(biāo)識(shí)符
最近在開發(fā)一個(gè)答題類的小程序,到了錄入試題進(jìn)行測試的時(shí)候了,發(fā)現(xiàn)一個(gè)問題,試題都是word文檔格式的,每份有100題左右,拿到的第一份試題,光是段落數(shù)目就有800個(gè)。而且可能有幾十份這樣的試題。
而word文檔是沒有固定格式的,想批量錄入關(guān)系型數(shù)據(jù)庫mysql,必須先轉(zhuǎn)成excel文檔。這個(gè)如果是手動(dòng)一個(gè)個(gè)粘貼到excel表格,那就頭大了。
我最終需要的excel文檔結(jié)構(gòu)是這樣的:每道題獨(dú)立占1行,每1列是這道題的一項(xiàng)內(nèi)容,大概就是問題、選項(xiàng)A、選項(xiàng)B等等。

但word文檔是這種結(jié)構(gòu),如果按照網(wǎng)上通用的方式去轉(zhuǎn),基本上你得到的結(jié)果就是一大坨文字都在一格里,根本不符合需求。

最后我想到了一個(gè)解決思路,可以實(shí)現(xiàn)這個(gè)需求,先看看我轉(zhuǎn)出來的結(jié)果:

這個(gè)格式雖然跟最終的有點(diǎn)差別,但是只要在excel文檔或者在代碼里稍微再修改一下,就能完全符合要求了。
廢話少說,先貼出代碼,看得懂的可以直接拿去用,看不懂的,可以看我后面的具體說明。
已經(jīng)把它封裝成通用腳本了,你可以直接調(diào)用。
import pandas as pd
import os
# 初始處理函數(shù)1,先對初始處理結(jié)果進(jìn)行判斷
def initail_handle_by_range(file_path, max_page_num, split_str):
df = pd.read_table(file_path)
# 2、先轉(zhuǎn)成Series
S = pd.Series(df['column1'].values)
# 3、轉(zhuǎn)成列表,列表的每個(gè)元素就是每個(gè)段落
list = S.tolist()
# 傳入一個(gè)max_page_num
# 4、遍歷列表,取出每個(gè)段落,按“.”切割,取出第一個(gè)元素進(jìn)行判斷,如果它是題號(hào),就應(yīng)該得到"1"或者"10"
index_list = []
for content in list:
try:
# 不是每個(gè)段落都有“.”可以切割的,會(huì)報(bào)錯(cuò),報(bào)錯(cuò)就跳過
first_str = content.split('%s'%split_str)[0]
# 5、根據(jù)最大的題號(hào),自動(dòng)生成匹配的字符串,用來匹配題號(hào)(每個(gè)匹配字符串都放在patch_list中)
patch_list = ['%d' % i for i in range(1, max_page_num + 1)]
# 6、比對切割得到的第一個(gè)元素,如果它在匹配的字符串中,就獲取它在列表中的索引,并把獲取到的結(jié)果添加到列表index_list中,這就知道了每道題的開頭在l中的哪個(gè)位置了
if first_str in patch_list:
index = list.index(content)
index_list.append(index)
except:
pass
# 7、根據(jù)索引列表,我們可以知道每道題的第一段和最后一段在l中的哪個(gè)位置
# index_list = [0, 8, 16]
# print(index_list)
# 先計(jì)算每道題長度是否一致,不一致的,設(shè)置is_same_length = False
is_same_length = True
length = index_list[1] - index_list[0]
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 判斷長度是否一致,不一致就對長度進(jìn)行比較,把大的賦值給長度
if (end - start) != length:
is_same_length = False
if (end - start) > length:
length = (end - start)
result = [is_same_length, index_list, list, length]
return result
# 初始處理函數(shù)1,先對初始處理結(jié)果進(jìn)行判斷
def initail_handle_by_patchstr(file_path, patch_str, split_str):
df = pd.read_table(file_path)
# 2、先轉(zhuǎn)成Series
S = pd.Series(df['column1'].values)
# 3、轉(zhuǎn)成列表,列表的每個(gè)元素就是每個(gè)段落
list = S.tolist()
# 傳入一個(gè)max_page_num
# 4、遍歷列表,取出每個(gè)段落,按“.”切割,取出第一個(gè)元素進(jìn)行判斷,如果它是題號(hào),就應(yīng)該得到"1"或者"10"
index_list = []
for content in list:
try:
# 不是每個(gè)段落都有“.”可以切割的,會(huì)報(bào)錯(cuò),報(bào)錯(cuò)就跳過
first_str = content.split('%s'%split_str)[0]
# 6、比對切割得到的第一個(gè)元素,如果它在匹配的字符串中,就獲取它在列表中的索引,并把獲取到的結(jié)果添加到列表index_list中,這就知道了每道題的開頭在l中的哪個(gè)位置了
if first_str == patch_str:
index = list.index(content)
index_list.append(index)
except:
pass
# 7、根據(jù)索引列表,我們可以知道每道題的第一段和最后一段在l中的哪個(gè)位置
# index_list = [0, 8, 16]
# print(index_list)
# 先計(jì)算每道題長度是否一致,不一致的,設(shè)置is_same_length = False
is_same_length = True
length = index_list[1] - index_list[0]
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 判斷長度是否一致,不一致就對長度進(jìn)行比較,把大的賦值給長度
if (end - start) != length:
is_same_length = False
if (end - start) > length:
length = (end - start)
result = [is_same_length, index_list, list, length]
return result
# 傳入一個(gè)文件路徑和一個(gè)匹配的字符串,至少2個(gè)符號(hào),例如"#."
def file_handle_by_patchstr(file_path, patch_str, split_str):
result = initail_handle_by_patchstr(file_path, patch_str, split_str)
# 接收初始處理函數(shù)的結(jié)果
is_same_length = result[0]
index_list = result[1]
list = result[2]
length = result[3]
# 先根據(jù)每道題的長度構(gòu)造一個(gè)空的dict,最后用來生成dataFrame
dict = {}
for i in range(1, (length + 1)):
dict['colomn%d' % i] = []
# print(dict)
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 遍歷一輪獲得的結(jié)果就是我們要寫入excel的一行
colomn = 1
for index in range(start, end):
# 遍歷一次獲得的結(jié)果就是我們要寫入excel的一格
content = list[index]
# 每遍歷一次就在一個(gè)dict中取出某一列,給它加上這個(gè)數(shù)據(jù)
dict['colomn%d' % colomn].append(content)
colomn += 1
# 在遍歷到最后一輪的時(shí)候
if index == (end - 1):
# 判斷是否需要插入空值
if not is_same_length and ((end - start) < length):
# 可能缺了2列,也可能缺了1列
content = ''
# 如果只是缺了一列,在現(xiàn)有的index上,加1,就是下一列,補(bǔ)上空值
if (length - (end - start)) == 1:
colomn = (end - start) + 1
dict['colomn%d' % (colomn)].append(content)
else:
# 如果缺失了2列以上,就遍歷,給之后的每一列都補(bǔ)上空值
for i in range(length - (end - start)):
colomn = length - i
dict['colomn%d' % (colomn)].append(content)
final_df = pd.DataFrame(dict)
new_file_path = file_path.split('.')[0] + '.xlsx'
final_df.to_excel(r'%s' % new_file_path)
def file_handle_by_range(file_path, max_page_num, split_str):
result = initail_handle_by_range(file_path, max_page_num, split_str)
# 接收初始處理函數(shù)的結(jié)果
is_same_length = result[0]
index_list = result[1]
list = result[2]
length = result[3]
# 先根據(jù)每道題的長度構(gòu)造一個(gè)空的dict,最后用來生成dataFrame
dict = {}
for i in range(1,(length+1)):
dict['colomn%d'%i] = []
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 遍歷一輪獲得的結(jié)果就是我們要寫入excel的一行
colomn = 1
for index in range(start, end):
# 遍歷一次獲得的結(jié)果就是我們要寫入excel的一格
content = list[index]
# 每遍歷一次就在一個(gè)dict中取出某一列,給它加上這個(gè)數(shù)據(jù)
dict['colomn%d' % colomn].append(content)
colomn += 1
# 在遍歷到最后一輪的時(shí)候
if index == (end - 1):
# 判斷是否需要插入空值
if not is_same_length and ((end-start)<length):
# 可能缺了2列,也可能缺了1列
content = ''
# 如果只是缺了一列,在現(xiàn)有的index上,加1,就是下一列,補(bǔ)上空值
if (length-(end-start)) == 1:
colomn = (end-start) +1
dict['colomn%d'% (colomn)].append(content)
else:
# 如果缺失了2列以上,就遍歷,給之后的每一列都補(bǔ)上空值
# 8-6 = 2, i = 0, 1
for i in range(length-(end-start)):
colomn = length - i
dict['colomn%d' % (colomn)].append(content)
final_df = pd.DataFrame(dict)
new_file_path = file_path.split('.')[0] + '.xlsx'
final_df.to_excel(r'%s'%new_file_path)
# 傳入一個(gè)文件夾路徑,最大的迭代數(shù)字,切割字符串
def dir_handle_by_range(dir_path, max_page_num, split_str):
files = os.listdir(dir_path) # 獲取當(dāng)前目錄的所有文件及文件夾
for file in files:
file_path = os.path.join(dir_path, file) # 遍歷獲取每個(gè)文件的絕對路徑
result = initail_handle_by_range(file_path, max_page_num, split_str)
# 接收初始處理函數(shù)的結(jié)果
is_same_length = result[0]
index_list = result[1]
list = result[2]
length = result[3]
# 先根據(jù)每道題的長度構(gòu)造一個(gè)空的dict,最后用來生成dataFrame
dict = {}
for i in range(1, (length + 1)):
dict['colomn%d' % i] = []
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 遍歷一輪獲得的結(jié)果就是我們要寫入excel的一行
colomn = 1
for index in range(start, end):
# 遍歷一次獲得的結(jié)果就是我們要寫入excel的一格
content = list[index]
# 每遍歷一次就在一個(gè)dict中取出某一列,給它加上這個(gè)數(shù)據(jù)
dict['colomn%d' % colomn].append(content)
colomn += 1
# 在遍歷到最后一輪的時(shí)候
if index == (end - 1):
# 判斷是否需要插入空值
if not is_same_length and ((end - start) < length):
# 可能缺了2列,也可能缺了1列
content = ''
# 如果只是缺了一列,在現(xiàn)有的index上,加1,就是下一列,補(bǔ)上空值
if (length - (end - start)) == 1:
colomn = (end - start) + 1
dict['colomn%d' % (colomn)].append(content)
else:
# 如果缺失了2列以上,就遍歷,給之后的每一列都補(bǔ)上空值
for i in range(length - (end - start)):
colomn = length - i
dict['colomn%d' % (colomn)].append(content)
final_df = pd.DataFrame(dict)
new_file_path = file_path.split('.')[0] + '.xlsx'
final_df.to_excel(r'%s' % new_file_path)
# 傳入一個(gè)文件夾路徑和一個(gè)匹配的字符串,至少2個(gè)符號(hào),例如"#."
def dir_handle_by_patchstr(dir_path, patch_str, split_str):
files = os.listdir(dir_path) # 獲取目錄的所有文件及文件夾
for file in files:
file_path = os.path.join(dir_path, file) # 遍歷獲取每個(gè)文件的絕對路徑
print(file_path)
result = initail_handle_by_patchstr(file_path, patch_str, split_str)
# 接收初始處理函數(shù)的結(jié)果
is_same_length = result[0]
index_list = result[1]
list = result[2]
length = result[3]
# 先根據(jù)每道題的長度構(gòu)造一個(gè)空的dict,最后用來生成dataFrame
dict = {}
for i in range(1, (length + 1)):
dict['colomn%d' % i] = []
# print(dict)
max_index = len(list)
for i in index_list:
# 如果i不是最后一個(gè),那么start就是i,end就是i的下一個(gè)
if i < index_list[-1]:
start = i
end = index_list[index_list.index(i) + 1]
else:
start = i
end = max_index
# 遍歷一輪獲得的結(jié)果就是我們要寫入excel的一行
colomn = 1
for index in range(start, end):
# 遍歷一次獲得的結(jié)果就是我們要寫入excel的一格
content = list[index]
# 每遍歷一次就在一個(gè)dict中取出某一列,給它加上這個(gè)數(shù)據(jù)
dict['colomn%d' % colomn].append(content)
colomn += 1
# 在遍歷到最后一輪的時(shí)候
if index == (end - 1):
# 判斷是否需要插入空值
if not is_same_length and ((end - start) < length):
# 可能缺了2列,也可能缺了1列
content = ''
# 如果只是缺了一列,在現(xiàn)有的index上,加1,就是下一列,補(bǔ)上空值
if (length - (end - start)) == 1:
colomn = (end - start) + 1
dict['colomn%d' % (colomn)].append(content)
else:
# 如果缺失了2列以上,就遍歷,給之后的每一列都補(bǔ)上空值
for i in range(length - (end - start)):
colomn = length - i
dict['colomn%d' % (colomn)].append(content)
final_df = pd.DataFrame(dict)
print(final_df)
print(file_path)
new_file_path = file_path.split('.')[0] + '.xlsx'
print(new_file_path)
final_df.to_excel(r'%s' % new_file_path)
if __name__ == '__main__':
# 文件路徑
# file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真題.txt'
# 文件夾路徑
dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest'
# 根據(jù)數(shù)字處理具體文件,參數(shù)傳文件路徑,可迭代的最大數(shù)可自定義,分隔符也自定義
# file_handle_by_range(file_path, 100, '.')
# 根據(jù)自定義匹配符處理具體文件,參數(shù)傳文件路徑,匹配符可以自定義,切割符也可以自定義
# file_handle_by_patchstr(file_path, '#', '.')
# 根據(jù)數(shù)字處理具體整個(gè)文件夾,參數(shù)傳文件路徑,可迭代的最大數(shù)可自定義,分隔符也自定義
# dir_handle_by_range(dir_path, 100, '.')
# 根據(jù)自定義匹配符處理具體文件夾,參數(shù)傳文件路徑,匹配符可以自定義,切割符也可以自定義
# dir_handle_by_patchstr(dir_path, '#', '.')
一、先說一下實(shí)現(xiàn)這個(gè)需求的處理邏輯
解決這個(gè)需求的關(guān)鍵點(diǎn)是什么: 1、python怎么讀取這個(gè)文件的內(nèi)容? python有相關(guān)的word操作庫可以讀取,但是讀取到的結(jié)果不方便操作。我們最終是要讓它生成excel文件的,所以可以用python非常強(qiáng)大的科學(xué)計(jì)算包pandas來讀取操作數(shù)據(jù)更好。
但pandas不能直接讀取word文件,所以,需要先把它轉(zhuǎn)成txt文檔,這一步很簡單,打開word,全部復(fù)制到一份新的txt文件中就行了。(注意要在第一行給它加上列名,我直接加了個(gè)colomn1,代表是第一列)簡單處理后的txt文檔的結(jié)構(gòu)類似這樣:

2、讀取到的數(shù)據(jù)如何處理?
使用pandas讀取到的數(shù)據(jù)是一個(gè)dataFrame,dataFrame的結(jié)構(gòu)就類似于我們在excel文檔里面那樣行列分明的。但是,它從txt讀取出來的格式是全部內(nèi)容都視為1列的,而txt中的每一段,在它這里就是每一行(注意是每一段對應(yīng)一行,而不是每一行對應(yīng)每一行)預(yù)覽一下:結(jié)果顯示800行,1列。也就是在txt文檔中有800個(gè)段落。

3、接下來怎么處理呢?
pandas強(qiáng)大的地方就在這里了,它可以直接把這1列的內(nèi)容全部轉(zhuǎn)成Series,Series是什么你可以不用管,你只需要知道Series可以直接轉(zhuǎn)成列表list就行了。有了list我們就方便操作了。
以上幾步就實(shí)現(xiàn)了從word里面讀取數(shù)據(jù),并轉(zhuǎn)化成python的數(shù)據(jù)類型list了。list里面的每個(gè)元素,就等同于我們word里面的每一個(gè)段落。控制臺(tái)打印出來的就是這樣:下面的800是計(jì)算出這個(gè)列表的長度,代表有800個(gè)元素。

接下來我們的需求就變成了:怎么把一個(gè)列表,轉(zhuǎn)成有明確行列結(jié)構(gòu)的excel表格了。
這個(gè)要分為2種情況來說: 1、你的word文檔結(jié)構(gòu)相對合理些,每道題都固定是X個(gè)段落(例如每道題都是8個(gè)段落),這個(gè)解決就很簡單了。因?yàn)檫@種情況對應(yīng)就是在list中,每8個(gè)元素構(gòu)成了1道題,你只要按照規(guī)律,8個(gè)8個(gè)取出,最后批量寫入excel就行了。(這種解決起來比較簡單,就不詳細(xì)說了)
2、另一種情況比較麻煩,就是word文檔的結(jié)構(gòu)不規(guī)范,有的題目可能是8個(gè)段落,有的可能是7段,有的是6段。那么要怎么解決呢?
解決這個(gè)問題有幾個(gè)關(guān)鍵點(diǎn): 1、excel表格是行列結(jié)構(gòu)的,它每一行的數(shù)據(jù)來源于這個(gè)txt文檔的第幾行?(也就是list里面的第幾個(gè)元素)所以我們只要把每道題在list中的索引找出來就行了。
觀察一下源數(shù)據(jù),它每道題的開頭都是數(shù)字加1個(gè)英文符號(hào)“.”,例如:“1.”和“2.”,最大的是"100.",并且其他段落的開頭都不會(huì)出現(xiàn)這個(gè)結(jié)構(gòu)。那么就簡單了,我先構(gòu)造出一個(gè)patch_list=[‘1', ‘2', ‘3'…‘100'],用來做匹配。
然后再遍歷源數(shù)據(jù)列表,對列表的每個(gè)元素按“.”號(hào)切割,切割后拿到它的第一個(gè)元素,拿這個(gè)元素跟pacth_lis進(jìn)行匹配,如果它是在patch_list中的,就代表它是每道題的開頭。此時(shí)就記錄下它的索引,并且把這個(gè)索引值存放到一個(gè)新列表index_list中。下面是我獲取到的index_list:

0代表了第一道題是在列表的第1個(gè)元素開始的,8代表第二道題在列表的第9個(gè)元素開始。
于是我們就知道每道題的開頭是在列表中的哪個(gè)位置了。
2、拿到了每道題的索引,然后怎么做呢?最終我們是要轉(zhuǎn)存到excel文檔中的, pandas怎么轉(zhuǎn)excel?很簡單的,只要你構(gòu)造出一個(gè)dataFrame出來,調(diào)用pandas的to_excel方法,就能存入excel文檔了。
3、問題的關(guān)鍵就變成了,有了每道題的索引,怎么把它轉(zhuǎn)成dataFrame結(jié)構(gòu)。下面演示一下,假如你想要構(gòu)造一個(gè)dataFrame,需要什么樣的數(shù)據(jù)結(jié)構(gòu),構(gòu)造出來的dataFrame在控制臺(tái)的輸出結(jié)果是怎么樣的,最后生成的excel表格是怎么樣的。
dict = {'colomn1': ['問題1', '問題2', '問題3'],
'colomn2': ["A:問題1的A選項(xiàng)", "A:問題2的A選項(xiàng)", "A:問題3的A選項(xiàng)"],
'colomn3': ['B:問題1的B選項(xiàng)', 'B:問題2的B選項(xiàng)', 'B:問題3的B選項(xiàng)']}
df = pd.DataFrame(dict)
print(df)
df.to_excel(r'C:\Users\Administrator\PycharmProjects\exchange_file\test.xlsx')
這個(gè)就是調(diào)用pandas的DataFrame方法,用字典dict生成的一個(gè)dataFrame數(shù)據(jù)。這個(gè)dataFrame在控制臺(tái)打印出來就是:

這個(gè)結(jié)構(gòu)存入excel就是對應(yīng)表格的行和列了。這個(gè)結(jié)構(gòu)就符合我的實(shí)際需求了。

所以我們要構(gòu)造出這個(gè)dataframe的關(guān)鍵就是:把所有數(shù)據(jù)梳理一遍,構(gòu)造成類似這樣的一個(gè)字典:
dict = {'colomn1': ['問題1', '問題2', '問題3'],
'colomn2': ["A:問題1的A選項(xiàng)", "A:問題2的A選項(xiàng)", "A:問題3的A選項(xiàng)"],
'colomn3': ['B:問題1的B選項(xiàng)', 'B:問題2的B選項(xiàng)', 'B:問題3的B選項(xiàng)']}
那么怎么構(gòu)建這個(gè)dict呢?
我們源數(shù)據(jù)轉(zhuǎn)出來的list結(jié)構(gòu)是類似這樣的: list = [‘問題1',“A:問題1的A選項(xiàng)”, ‘B:問題1的B選項(xiàng)'…‘問題2',“A:問題2的A選項(xiàng)”, ‘B:問題2的B選項(xiàng)']
而我們前面得到的index_list=[0, 8, 16。。。。] 它記錄了“問題1”,“問題2”等等直到“問題100”是在哪個(gè)位置開始的,所以我們只需要把index_list遍歷一下,輪流取出它的每個(gè)元素,它就是每道題的開始位置,然后拿到緊跟在這個(gè)元素的下一個(gè)是什么,用這個(gè)減去1就知道了每道題的開始位置start和結(jié)尾位置end是多少了。
接著使用
for i in range(start, end): content = list[i]
就可以輪番從list中取出每道題的各項(xiàng)內(nèi)容,取到的第一個(gè)就加到dict的colomn1列表中,第二個(gè)就加到dict的colomn2中,按照這個(gè)規(guī)律,就能把list的內(nèi)容分開插入到dict中的各個(gè)列表中了。
但在這個(gè)過程中,可能你每道題的段落數(shù)目不一致,也就是你按照這個(gè)規(guī)律從list中取出的元素,可能每次取出的數(shù)量都不一樣。這點(diǎn)需要注意,如果沒有對它進(jìn)行處理,最后會(huì)導(dǎo)致轉(zhuǎn)出來的文件內(nèi)容錯(cuò)位了,例如你的文檔里面,第一題有8個(gè)段落,第二題只有7個(gè),第三題有8個(gè)段落,沒處理這個(gè)問題的話,最后第三題的第8個(gè)段落,就會(huì)跑到第7題那邊了。并且最終dataFrame會(huì)無法生成excel文件。
那么這個(gè)問題怎么解決呢?
在正式調(diào)用處理函數(shù)生成excel文件之前,可以先對文件預(yù)處理,拿到它們的數(shù)據(jù)進(jìn)行判斷,如果判斷到它每個(gè)間隔不一樣,有的缺少段落,那么就讓數(shù)據(jù)預(yù)處理函數(shù)返回一個(gè)值為False,間隔一樣就返回True。接著在真正的數(shù)據(jù)提取環(huán)節(jié),根據(jù)這個(gè)進(jìn)行判斷,如果判斷到它值是Fales,那么就在每一輪遍歷提取數(shù)據(jù)的最后一次遍歷,一次性在它后面的缺失數(shù)據(jù)的列加上空字符串,作為占位用,這樣最后得到的列表長度就都一樣了,并且在最后生成的excel表中,它是一個(gè)空格。
最后用dict生成dataFrame,再寫入excel文檔,我們就大功告成了。
二、再說一下具體怎么使用:
一、運(yùn)行必須的工具 1、python解釋器(pycharm或其他); 2、python自帶模塊:os; 3、自行安裝模塊:pandas,openpyxl;
自行安裝的模塊,在控制臺(tái)pip install pandas和pip install openpyxl就行了。
二、怎么調(diào)用:
1、先要做數(shù)據(jù)預(yù)處理:先要把word文檔的內(nèi)容復(fù)制到txt文檔中,并且在第一行加上"column1",處理后像下面這樣:

接著要看你的文檔內(nèi)容是否有題號(hào),如果有的話:比如像我這個(gè),有具體的題號(hào)1-100題,并且它的寫法都是“1.”,在題號(hào)后面跟了個(gè)英文字符'.‘,順序遞增到100。

那么你就可以調(diào)用file_handle_by_range。
你給它傳第一個(gè)參數(shù)是個(gè)具體的文件路徑,它就會(huì)去打開這個(gè)文件,讀取里面的內(nèi)容。
傳的第二個(gè)參數(shù)是100,它就會(huì)自動(dòng)生成1到100的字符串,用來匹配識(shí)別你的每道題的開頭在哪個(gè)位置。(如果你最大的題號(hào)是200,就寫200,可以寫多,但不能寫少,少了識(shí)別到的內(nèi)容會(huì)缺失)
傳的第三個(gè)參數(shù)是'.‘,它就會(huì)按照'.'去切割每一行的內(nèi)容,拿到第一個(gè)“.”號(hào)前面的內(nèi)容,用來跟它生成的匹配字符做比對,比對成功了,它就默認(rèn)該行是你想要寫到excel表格里的第一列,接在它后面的每個(gè)段落,會(huì)自動(dòng)插入到它后面的列。
直到匹配到下一個(gè)“數(shù)字.”開頭的,又重復(fù)這個(gè)過程。
如果你的文檔里面并不是像我這樣,沒有順序遞增的題號(hào),你可以手動(dòng)給每個(gè)你想要放在表格中第一列的段落,在它前面加標(biāo)識(shí)符,例如“####.”,注意最后是有個(gè)小點(diǎn)的。像下面這樣:

接著調(diào)用
for i in range(start, end): content = list[i]
那么它就默認(rèn)按照'.‘去切割每行內(nèi)容,并且按照####來匹配識(shí)別切到的內(nèi)容,如果切到在'.'前面的是“####”,那么它就默認(rèn)這一段是你想存到excel表第一列的段落,在它后面的幾段,都會(huì)按照每個(gè)段落存入一格去處理。直到下一個(gè)“####.”出現(xiàn)。
2、可調(diào)用的有4個(gè)函數(shù): 2.1、假如你只想處理一個(gè)具體的文檔,并且它有具體的題號(hào),最大題號(hào)是100,并且它后面跟的是一個(gè)'.',那么就按照下面這個(gè)調(diào)用
file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真題.txt' file_handle_by_range(file_path, 100, '.')
2.2、根據(jù)自定義匹配符處理具體文件,參數(shù)傳文件路徑,匹配符可以自定義,切割符也可以自定義
file_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\2018-04 技能操作真題.txt' file_handle_by_patchstr(file_path, '#', '.')
2.3、根據(jù)數(shù)字處理具體整個(gè)文件夾,參數(shù)傳文件路徑,可迭代的最大數(shù)可自定義,分隔符也自定義。(注意文件夾路徑,最后是不跟文件名的,它是個(gè)文件夾,不是具體文件路徑)
# 文件夾路徑 dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest' dir_handle_by_range(dir_path, 100, '.')
2.4、根據(jù)自定義匹配符處理具體文件夾,參數(shù)傳文件路徑,匹配符可以自定義,切割符也可以自定義
# 文件夾路徑 dir_path = r'C:\Users\Administrator\PycharmProjects\exchange_file\mytest' dir_handle_by_patchstr(dir_path, '#', '.')
總結(jié)
以上所述是小編給大家介紹的python實(shí)現(xiàn)word文檔批量轉(zhuǎn)成自定義格式的excel文檔的思路及實(shí)例代碼,希望對大家有所幫助,也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手
這篇文章主要介紹了使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手,串口通訊程序首先要對串口進(jìn)行設(shè)置,如波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等,需要的朋友可以參考下2022-04-04
Python根據(jù)服務(wù)獲取端口號(hào)的方法
這篇文章主要介紹了Python根據(jù)服務(wù)獲取端口號(hào),文中給大家提到了linux查看端口開啟端口的方法,需要的朋友可以參考下2019-09-09
Linux上安裝Python的PIL和Pillow庫處理圖片的實(shí)例教程
這里我們來看一下在Linux上安裝Python的PIL和Pillow庫處理圖片的實(shí)例教程,包括一個(gè)使用Pillow庫實(shí)現(xiàn)批量轉(zhuǎn)換圖片的例子:2016-06-06
Python實(shí)現(xiàn)員工信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)員工信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
python獲取當(dāng)前用戶的主目錄路徑方法(推薦)
下面小編就為大家?guī)硪黄猵ython獲取當(dāng)前用戶的主目錄路徑方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
python實(shí)現(xiàn)websocket的客戶端壓力測試
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)websocket的客戶端壓力測試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

