掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 880|回复: 16

[工具] txt文本格式化工具mdxFormat(python3.9.5编写)

[复制链接]

该用户从未签到

发表于 2021-7-25 10:47:05 | 显示全部楼层 |阅读模式
本工具适用python3.9.5编写。可以把指定路径(包含子目录)下的txt文档格式化为mdxbuilder使用的格式(每个词条三行:key,value,</>)。- y. K* g& w/ k6 c) ^5 H1 Y9 c
特点:
6 d% F, k+ r$ i) j1.支持不同编码格式的txt文档,默认输入输出均为“gbk”编码。
5 Q5 L0 c8 ~  ^* e2.我写这个工具是为了整理个人的常用资料,为关键词添加超链接,实现跳转。
6 ?$ V# D; v; r$ v* B) }/ nps:我以前一直使用其他人写好的程序格式化txt文档,但是如果关键字之间存在嵌套,超链接格式化有问题,所以我自己编写了这个程序,但还有一点不完美之处,就是不能很好的解决自身跳转的超链接。望大神指点!
( @3 I* `# }, f# @5 X9 n/ n8 K, M. d& U: x' Z+ B5 y2 _

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

该用户从未签到

 楼主| 发表于 2021-7-26 12:34:25 | 显示全部楼层
n0thing 发表于 2021-7-26 02:18: g) Y: X1 d1 I- Y, o
能不能發一個 .txt 的範例?
$ u+ n$ y, k$ y* q6 j" K
txt文档的文件名为关键字、文件内容就是词典内容。
( k3 C6 E3 ^- k8 a# J3 W+ ]
3 z0 }: i5 o- ], ]+ e我主要为了实现资料间的超链接跳转。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x
  • TA的每日心情

    2021-7-8 21:03
  • 签到天数: 81 天

    [LV.6]常住居民II

    发表于 2021-7-26 02:18:24 | 显示全部楼层
    能不能發一個 .txt 的範例?
  • TA的每日心情
    开心
    2023-1-18 23:24
  • 签到天数: 211 天

    [LV.7]常住居民III

    发表于 2021-7-25 11:58:06 | 显示全部楼层
    默认输入输出均为“gbk”编码
    能不能默认输出UTF-8编码呢?“gbk”编码不方便文本编辑啊
  • TA的每日心情
    开心
    2019-8-21 19:27
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2021-7-25 12:23:14 | 显示全部楼层
    支持mdx制作脚本

    该用户从未签到

     楼主| 发表于 2021-7-25 14:34:00 | 显示全部楼层
    本帖最后由 muyuzhth0 于 2021-7-25 14:38 编辑 % e# [! h" T1 H/ y- n1 [1 ?
    kyletruman 发表于 2021-7-25 11:585 B, j! f! t' s2 E0 M8 L- @
    能不能默认输出UTF-8编码呢?“gbk”编码不方便文本编辑啊

    " ]) n# N9 b9 M; M7 j7 I- u: ?  o1 x' ]/ y: s
    我制作的txt文档源文件是gbk格式的,如果您的是utf-8,只需要把writeTxt()函数里,f=open(outPath,"a",encoding="ANSI")这条语句的ANSI修改为utf-8即可。

    评分

    1

    查看全部评分

    该用户从未签到

     楼主| 发表于 2021-7-25 14:34:45 | 显示全部楼层
    本帖最后由 muyuzhth0 于 2021-7-25 14:40 编辑
      l0 K' x) W# x; J+ x) i$ ~# c( b1 Z' E2 b6 a. }/ k+ M
    输出默认是gbk
  • TA的每日心情
    擦汗
    2021-11-17 09:18
  • 签到天数: 79 天

    [LV.6]常住居民II

    发表于 2021-10-6 20:16:02 | 显示全部楼层
    我的版本是 3.9.7  , 遇到了问题 。请帮助 & j2 k7 M. }; q; q
    7 b+ V3 A. [% V/ Y. L  h. H
    1. ❯ python mdxFormat_upload_V3.5.py! S1 b+ W# r4 T( e: r
    2. 没有发现文件名相同的文件,处理中...
      7 v4 T$ c/ x+ V% k# E4 g
    3. 找到了4个txt文档,2 d0 c, C) E+ `1 q- |5 e3 L
    4. 开始格式化、合并文档:
      ; ]5 n7 n3 m. v
    5. 读取文档失败:/Users/vivian/Downloads/mdxFormat_upload_V3.5/test/药品检查管理办法.txt
      ) R- b  E5 c! @* }
    6. 已完成第  1   个读取文档失败:/Users/vivian/Downloads/mdxFormat_upload_V3.5/test/我的广告法管理条例.txt
      5 ]* |8 \; N: n# T& U# _0 K
    7. 已完成第  2   个读取文档失败:/Users/vivian/Downloads/mdxFormat_upload_V3.5/test/北京市反食品浪费规定.txt
      1 p, `0 J$ |5 n0 ]& D9 x
    8. 已完成第  3   个读取文档失败:/Users/vivian/Downloads/mdxFormat_upload_V3.5/test/中国共产党组织工作条例.txt; |5 I. P! V4 f# |* A: B
    9. 已完成第  4   个, f; K- A: c6 K% ?
    10. 开始循环添加超链接关键词辅助标记:$ V& f- O" v3 }* y% S- x0 ?
    11. 已完成第  4   个
      5 ^# @0 h5 P6 g; i8 g& o
    12. 开始循环清理嵌套的冗余的超链接关键词辅助标记:- G1 o9 o8 Y' `
    13. 已完成第  4   个; Z2 Z+ _2 b" q6 s
    14. 开始添加超链接,4 `2 _6 R' y- z! ^' t4 \
    15. 开始清理辅助标记,6 Y7 M  \% E# m4 j4 Z( E
    16. 开始写入文本,6 G4 A1 m  p- ?% H8 _
    17. Traceback (most recent call last):( ~" s3 \+ y0 V# b
    18.   File "/Users/vivian/Downloads/mdxFormat_upload_V3.5/mdxFormat_upload_V3.5.py", line 219, in <module>/ S& ?8 \' W+ o7 ^  y* a/ X
    19.     main()
        d3 o% I+ h$ m
    20.   File "/Users/vivian/Downloads/mdxFormat_upload_V3.5/mdxFormat_upload_V3.5.py", line 213, in main
      ; r8 v$ S9 @1 @1 l
    21.     mdxFormat(path,outputPath)
      $ k  \: l- g$ M2 s, D
    22.   File "/Users/vivian/Downloads/mdxFormat_upload_V3.5/mdxFormat_upload_V3.5.py", line 198, in mdxFormat) c9 n4 c6 d, x% _& w9 P2 Y
    23.     if writeTxt(txt,outputPath):
      # ~" A  _, I& K/ l) H# E
    24.   File "/Users/vivian/Downloads/mdxFormat_upload_V3.5/mdxFormat_upload_V3.5.py", line 48, in writeTxt
      ; U, O. `" O, W* D: z
    25.     os.mkdir(path)
      7 g( x* Y9 a. Y* H) _
    26. FileNotFoundError: [Errno 2] No such file or directory: ''
    复制代码

    该用户从未签到

     楼主| 发表于 2021-10-6 22:34:08 | 显示全部楼层
    漫步云海涧 发表于 2021-10-6 20:16
    # h5 ~1 X& [% g3 S  H) d我的版本是 3.9.7  , 遇到了问题 。请帮助
    2 i6 i1 T0 U! |. P/ J1 g8 p/ J/ E
    mdxFormat读取文件的路径是绝对路径。你得在mdxFormat_upload_V3.5.py-中设置下文本文件的路径。有个变量“path”

    该用户从未签到

     楼主| 发表于 2021-10-6 22:47:27 | 显示全部楼层
    漫步云海涧 发表于 2021-10-6 20:16" O* e; H" a' ^
    我的版本是 3.9.7  , 遇到了问题 。请帮助

    , j$ c$ |2 l* ]# x1 \2 l你把在“mdxFormat_upload_V3.5.py”中修改的代码贴出来看下。
  • TA的每日心情
    擦汗
    2021-11-17 09:18
  • 签到天数: 79 天

    [LV.6]常住居民II

    发表于 2021-10-7 07:59:27 | 显示全部楼层
    muyuzhth0 发表于 2021-10-6 22:47
    * W* [3 f& D: J+ ~0 y( Z( }/ V你把在“mdxFormat_upload_V3.5.py”中修改的代码贴出来看下。
    ( @- p# O) Z  Z& \5 y$ S9 r
    好的!!  麻烦了6 P3 k" W) M9 M  y) X8 D

    0 G; r/ S" @1 \! c  T. F7 x6 f
    1. import os
      3 N6 B4 @  t. |' `6 e( f5 l6 A
    2. import glob
      + I) D' D: W5 T, d0 p+ Y
    3. import re9 d* {# |/ H( m7 Z3 E. \! D4 T
    4. import time. H- ~% ~6 @# c" a! A

    5. ( I7 z, p- w3 J$ P' [6 E
    6. #遍历所有子文件  \' l; X( k- J" z4 u* A8 |
    7. def getFileListAll(filePath):
      * T0 x' i" s% r
    8.     filelist=[]
      2 l7 U6 d9 U1 x$ Z( p7 D7 F# C0 S
    9.     for root, dirnames, filenames in os.walk(filePath):' G/ Z" m4 C3 V" Y- t' \. \% N
    10.         for filename in filenames:
      6 w6 Z7 f( `/ t- J  `
    11.             filelist.append(os.path.join(root,filename))( q. ~* P* L/ Y* D/ ?2 |( J$ w: _
    12.             #print(os.path.join(root,filename))5 ]: F& |, S9 Z5 e* u- X
    13.     return filelist
      5 r6 v$ e8 l5 {2 g

    14. % z% Z9 B/ D, `) z) B1 D8 x8 v+ N* K
    15. #判断是否为txt文档; _8 y6 R6 ~& G1 o( g& Q' q1 ?
    16. def isTxts(nameList):8 w) ]* Y5 a) Y' s- D# Y
    17.     pattern=r"^[^~$].+\.(txt)$"    7 ]6 N" W* }' k9 p; o
    18.     patternObj=re.compile(pattern,re.I)$ ^/ e4 G7 @: O! y) U/ ]
    19.     notTxtList=[]
      5 F1 n, P& _; U( T+ O% \
    20.     for fileName in nameList: 4 U' ^; G& Y/ h; P6 \
    21.         if not patternObj.fullmatch(fileName):   #判断是否为txt文件    + t- f" B, x; c% q. `* F
    22.             notTxtList.append(nameList)& Z3 i+ `  G  Y
    23.     if notTxtList:" Q7 }4 z+ D2 @% p3 e5 ]
    24.         print("存在非txt文件:{0:},请处理后再运行程序!".format(notTxtList))+ W- b  w8 v! C9 j3 L  t! R
    25.         return False0 k$ ?$ R1 J/ h) }( {- n
    26.     else:
      4 Q: D/ v3 E9 c* h! O' g
    27.         return True    4 V& A( h! w$ a# i$ p) e

    28. ! P6 i2 p/ N" h* d* {, q$ \
    29. #在指定的txt文档中查找关键字) r" ~! Y% E  v/ a2 P$ O/ G/ y
    30. def readTxt(fileName):#strkey:查找的关键字;fileName:文件路径
      ' |4 H# i3 Y+ x% |' P8 W
    31.     pattern=r"^[^~$].+\.(txt)$"   
      / h2 v+ `( I4 Y- ?% Q: `4 x3 t
    32.     patternObj=re.compile(pattern,re.I)
      ) ]- {* l, Z: [; K+ |
    33.     if patternObj.fullmatch(fileName):   #判断是否为txt文件             . W, s) [- p* U5 H" F! H! x' p
    34.         try:
      & X8 g! D9 C, o) \6 o1 d
    35.             f=open(fileName,"r",encoding="utf-8")/ s: l! W: l% I5 v9 ]% k
    36.             txt=f.read()
      + t0 R, U* f% U0 ]4 M
    37.             f.close()            0 o# m$ a9 t% [+ l' Z/ k+ x; v
    38.         except:" ^( U: [5 m, w5 F& N9 `3 [
    39.             print("读取文档失败:{0:}".format(fileName))
      6 z& |: N, b' C1 U3 `+ w" D- b6 b8 ?
    40.             return ""            ( a8 I" G* t0 u
    41.         else:   #无异常时,执行: y9 j3 h0 m  n! I- F2 p
    42.             return txt- `2 ^; a+ ^$ x3 r
    43.         #finally:    #无论是否异常,都执行0 B7 k+ O( s: n6 n* h" H

    44. - {' n" H( N/ X$ c; i; N  X
    45. def writeTxt(txt,outPath):/ l/ v4 ^1 ^9 i  e
    46.     path="\".join(outPath.split("\")[0:-1])$ J% v  F% e3 d2 i; p/ i+ Y
    47.     if not os.path.exists(path):* W8 Z2 J3 T1 F% ~+ D8 ?- {
    48.         os.mkdir(path)   
      7 g6 P' h+ f6 W( ]  @
    49.     try:
      5 Q) j% T- Y/ Y+ t. w9 P
    50.         f=open(outPath,"a",encoding="utf-8")
      9 w6 K$ B' t0 K5 `1 j3 Y7 r
    51.         f.write(txt)- j$ }1 q: o% l5 f' e+ m
    52.         f.close()' b( Z5 I. V! ?  k8 V
    53.         return True            
      " s) K& U4 T7 M* G
    54.     except:
      9 B6 g' A2 h0 S) _0 O- H
    55.         print("写入文档失败:{0:}".format(outPath))3 s  r. q  A+ p# |8 j: p
    56.         return False: `8 \9 X, m5 S% m4 d, m
    57.         #else:   #无异常时,执行, x: r7 _! ]; n5 [; F
    58.         #    return txt% W* S% k. g3 E0 T
    59.     #finally:    #无论是否异常,都执行
      $ h2 T( b+ m$ o3 @

    60. * O, Y/ V) B+ ~# J* F
    61. def getfileName(fileList):
      9 _9 W% {+ T* P2 v  u8 X
    62.     '''& F1 M% k% p! ]' @  U
    63.     :param fileList:文件路径列表( Y% ^) Z. j- [) L3 z1 `
    64.     :return nameList:文件名称列表有扩展名# O0 {1 H4 S5 N9 s
    65.     '''6 S: d' P7 Z8 _7 A. `% b
    66.     nameList=[], h! {8 t$ Q0 i# }
    67.     for fileName in fileList:
      ( O  d* ?+ E# }3 Y3 M% ~9 s1 u1 c
    68.         name=fileName.split("\")[-1]#提取文件名* r3 T+ L, f+ h* Y0 R% J, Y: [
    69.         nameList.append(name)
      ; M( Q1 W$ Q& N- o* A
    70.     return nameList' F6 r$ {2 V9 g9 V! _- R

    71. ; o3 s: V3 F) R
    72. #显示重复的文件名,如果有重复文件显示重复的文件名称,并返回False,否则返回True
      ( I5 G9 o3 t5 Z* U( z9 h0 Q4 I
    73. def showDupFile(nameList):& V8 w: F0 e, E: X  G0 V- `4 \2 v
    74.     '''
      9 O9 F9 c% X; G$ w1 D
    75.     判断是否有文件名相同的文件# c8 I" D+ p' }
    76.     :param fileList:文件名列表,包含绝对路径! U! v/ Y6 K; E) j. }$ g) v
    77.     :return: 如果有重复文件显示重复的文件名称,并返回False,否则返回True* a4 ~& \! Z* T% `; O- v# J3 v/ a
    78.     '''
      , ?- E$ O! F3 w+ Z
    79.     if nameList:    #如果文件名列表不为空- F9 T6 `3 _- N# I- n7 P
    80.         nameSet=set(nameList)- g: [$ n8 ^" o) n
    81.         DupNameList=[]
      # e; S- W  g. O5 O0 n4 ~( X7 G
    82.         for item in nameSet:+ \9 X: C9 l; U- A$ c7 ~
    83.             if nameList.count(item)>1:( v- D+ u- P# r/ l! {% O4 y
    84.                 DupNameList.append(item)
      % w+ B7 ]1 O. B: M! R& {, {, `
    85.         if DupNameList:#保存重复文件名的列表
      % T, y: B% H3 y1 [2 b2 j, h) V8 B3 P
    86.             for L in DupNameList:
      6 n6 V% b7 W/ b7 d( C* ?
    87.                 print("{0:}为重复的文件,请处理!".format(L)) - c8 q+ c) B, Y! w: y
    88.             return False
      % D+ d2 T5 h0 h) m
    89.         else:! p2 d; ^7 ~( h4 z8 W9 z9 o
    90.             print("没有发现文件名相同的文件,处理中...")
      % O  e+ J' f! Y  @
    91.             return True! @5 {' u8 C7 F  ?" k) {

    92. 4 e/ ?% f" S2 P
    93. def nameListSort(nameList,rev=True):
      7 g9 Z9 }5 w$ r' r+ o* E8 }
    94.     '''
      % g! W3 z+ k0 E& i8 X: t+ [9 t
    95.     按照字符串长度排序8 \3 {% P' `/ I0 l" j
    96.     :param fileList:文件名列表. C( f# x/ \, `# e# [: y0 ]) b
    97.     :param reverse:默认降序; U5 t' v4 ]8 _2 J8 `: Q+ m
    98.     :return newNameList:返回排序后的文件名新列表) U; \1 I& I/ H' ^
    99.     '''
      ; w2 Q, G6 j; p1 |- T+ ?3 Z
    100.     newNameList = sorted(nameList,key = lambda i:len(i),reverse=rev) #按照字符串长度排序,降序- B9 s# I0 F3 T. _* g
    101.     return newNameList   
      5 L$ m0 _9 E; u  J, v) {9 e
    102. - c/ h5 H5 R: ?* E; P& r' y
    103. #添加超链接
      , H- M( D8 U# c' p
    104. def formatTxtHref(nameList,txt):
      . h( ^  b  g) e$ [
    105.     '''
      1 v5 R4 ^* E* q& s3 H! _+ R
    106.     func:在文本中为特定字符串添加超链接/ h% J. I& o2 ~( m5 p
    107.     :param hrefStr:待添加超链接的字符串
      / N/ D" e! O7 i& s
    108.     :param txt:文本字符串
      6 g2 c6 e) I( X
    109.     :return txt:格式化的文本字符串
      , b8 O* u4 Q+ @6 s" ]5 ^1 W
    110.     ''': ]/ {/ q) H! s+ s8 c
    111.     print("\n开始循环添加超链接关键词辅助标记:")+ q* ~/ B+ K9 y5 O8 Z, J. d  b
    112.     count=01 k* U1 d8 n7 E# I& @
    113.     nameListDescend=nameListSort(nameList)
      ( Y0 \: C( n" ^) T. H0 \; ~* y- c( m
    114.     for nameD in nameListDescend:7 Y) @/ p6 r* t4 f) z* j: `; m
    115.         nameDSimple=nameD.replace(".txt","")
      % r$ c1 ~3 z; z3 v6 B
    116.         nameDSMarked="【@"+nameDSimple+"@】"/ T7 i, D7 y! S8 T' n
    117.         txt=txt.replace(nameDSimple,nameDSMarked)/ b7 ~5 S) ]; q5 P+ ~# ?5 _
    118.         count=count+1
      7 G( i: b5 [9 h
    119.         print("\r已完成第{0: ^6}个".format(count),end="")     7 S6 Y. h1 I0 K4 e

    120. 7 a- V; }# z6 }1 h+ H
    121.     print("\n开始循环清理嵌套的冗余的超链接关键词辅助标记:")
      5 u- ?% P! u5 l- |$ Q
    122.     count=05 H0 L- b) W. D9 S+ N1 ]% K2 ~# y6 s
    123.     nameListAscend=nameListSort(nameList,rev=False)
      1 d/ Q% c9 f4 I! [* `4 D
    124.     for nameA in nameListAscend:
      6 F  c* X. Q3 s  m1 A" p& g) O
    125.         nameA=nameA.replace(".txt","")# D/ y% z5 l' B. O+ q- f/ z" N
    126.         pattern=r"【@([^@】]*?)【@{0:}@】".format(nameA)        6 U) R, e, ^% u
    127.         patternObjTxt=re.compile(pattern)' n3 t3 w* S6 u7 W# Z/ z
    128.         toHrefStr="【@"+"\\1"+"muyubug"+nameA3 B- j* B0 w/ d1 I; I9 o
    129.         txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
        }1 R' N9 F' Z: M& `. I
    130.    
      ) }# F2 S. F( s- H
    131.         pattern=r"【@{0:}@】([^【@]*?)@】".format(nameA)        
      ; j, \2 o; [2 l. `
    132.         patternObjTxt=re.compile(pattern): ?; |' m* ~6 k5 ?
    133.         toHrefStr=nameA+"\\1"+"muyubug"+"@】"
      3 @0 B/ ?  X( @" ^$ O+ g' L
    134.         txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
      - H! |5 c) S. S1 z1 K2 e6 X
    135.         txt=txt.replace("muyubug","")
      7 `- `6 M, ?* a% K
    136.         count=count+1
      0 y: `( f- I0 I6 [0 Q4 R
    137.         print("\r已完成第{0: ^6}个".format(count),end=""), |4 e7 Q, Q& \  ^( X! e/ s
    138.     & ]/ {1 r- J2 @) W; b6 O4 q
    139.     print("\n开始添加超链接,") ! a+ }  L. U, w
    140.     pattern=r"【@([^【@]+?)@】"
      5 _/ V0 B  k" r
    141.     patternObjTxt=re.compile(pattern)
      $ N/ a! v1 v+ s( s1 T5 Q  v+ ^
    142.     toHrefStr=r"<a href='entry://\1'>\1</a>"
      , C1 Q; p, I0 k% x
    143.     txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
      7 R* c) m0 ]; L+ N( R" p& i
    144.         
      1 N9 O( Y& W: q
    145.     print("开始清理辅助标记,")
      # n- z: C9 i5 I, d" @
    146.     txt=txt.replace("<@>","")( J, R* A$ ?& C) i" f# \) v
    147.     return txt
      ) b& U* T0 m3 e- ?; ]

    148. $ `5 c: b: n% S$ |' A2 S# F+ a, Z0 E
    149. def formatText(fileName):
      & r, `4 r( |: C- ~1 ?
    150.     '''( K& o: n# A- J  m" T( q- N: k* G
    151.     func:清洗字符串,格式化
      - o+ L  A/ Y& |6 U! s( Z
    152.     :param fileName:待处理文件, k, Q" y# c  q; x/ q
    153.     return txt:处理后的字符串. O6 l0 A+ [; ?4 j
    154.     '''& E$ z& P: W. u$ ^7 W, ^3 f  ~' Z
    155.     #提取文件名
      - ~/ X/ [, g' a. i& }: }
    156.     name=fileName.split("\")[-1].replace(".txt","")$ a! m! V/ c( `0 f* H  L
    157.     #在文件名的每个字符键添加标记符
      7 j5 ]! n5 `$ Z
    158.     pattern = re.compile('.{1,1}')
      4 A9 D# k/ e: ]+ r0 L  n2 Z
    159.     matchCharList=pattern.findall(name)4 `2 X6 m. q) |/ \6 `% R4 X' B
    160.     nameMaked="<@>".join(matchCharList)# k, a* ~& |- f0 o
    161.     #生成标题部分
      - v3 ?5 W1 O- |9 R' K3 G
    162.     txtTitle=nameMaked+"\n", H0 J" C, i; A* i3 k, U# H+ [
    163.     #读入文件5 b0 c/ R2 n  [' j4 C. B% _8 L/ x
    164.     txtContent=readTxt(fileName)            
      - [% B( Y7 A, Y7 b+ G% B6 A* a
    165.     #替换正文中的特殊字符) l3 j, n! B! ]* }: S
    166.     strList=["\n","<br>"]    + K+ ~8 d. s7 U1 o1 b* a+ ]
    167.     for ch in strList:
      0 W$ ]. }) t( S: i
    168.         txtContent=txtContent.replace(ch,"<BR>")
      8 M* C( ]+ \: Y
    169.     #合成整个词条的内容
      3 w4 H1 J3 M# ]' ]8 R; g1 k
    170.     txt=txtTitle+txtContent+"<BR>\n</>"0 I7 c4 d4 {* c+ U  _+ v
    171.     return txt5 F. G" x; t( D

    172. % _  ?. x7 I2 M
    173. def mdxFormat(path,outputPath):) y( J& \& d2 @5 z+ V  U( [
    174.     '''
      8 ^$ y$ F8 t# z' }
    175.     func:格式化文本
      , N: q) j: T8 z# @4 H
    176.     :param path:待格式化文本的路径
      # l) @* n& f" S; |" V1 r- @
    177.     :param outputPath:输出的路径和文件名- B+ {6 q: m; u, n- F  \* T) t0 B
    178.     '''9 @& g: w- K- r) Z+ V9 _5 Z, k
    179.     fileList=getFileListAll(path)#获取指定目录下的全部文件,包括子目录中的文件
      " i; p/ W3 I7 {. D+ |
    180.     nameList=getfileName(fileList)
      / r1 X* Z7 \% b/ F4 V2 q
    181.     if isTxts(nameList):
      % O+ M  W6 T. R' N
    182.         if showDupFile(nameList):#如果没有重复文件/ p4 b0 ]; ?8 ?0 B
    183.             print("找到了{0:}个txt文档,".format(len(nameList))). J* J% i& E8 B7 ~7 R- V
    184. + O; v1 m$ w5 e* w
    185.             print("开始格式化、合并文档:")
      / e( H' d2 }" v* x3 S
    186.             count=0#txt文档数量统计
      , H( u. F% f6 _! H2 {- ^% {) v  B
    187.             txtList=[]#存储文件内容
      - W* W: T# B" L
    188.             for fileName in fileList:               
      & F! u/ q/ i$ j+ U
    189.                 txt=formatText(fileName) #转换换行和<br>为<BR>                   2 m. M) ]% Z6 d- d6 \" W( I
    190.                 txtList.append(txt)# O  U( @: d; n' ^0 g6 j  {$ f- U
    191.                 count+=1' ]1 m; C+ g0 c9 ?+ c
    192.                 print("\r已完成第{0: ^6}个".format(count),end="")                   ' X7 U; F9 g: \' s' j1 |
    193.             txt="\n".join(txtList)' Q! ~# U: R& C. C0 M
    194.             
        h; E! z' s; d
    195.             #添加超链接- i; ~. ~* U2 I4 t/ r0 O3 h5 d
    196.             txt=formatTxtHref(nameList,txt)
      3 v- l( p2 i4 B
    197.             print("开始写入文本,"). |( M( X( J( e; L- n& @. z
    198.             if writeTxt(txt,outputPath):" D- {7 P8 g8 j$ m+ R
    199.                 print("文件合并输出成功!"): L5 F9 o" V" H9 J* p7 p0 M
    200.             else:
      0 |6 Y- R! s5 t. m1 V( B
    201.                 print("Error:Merge!")
      ' d& C5 t4 b* }* N" u/ v, J8 n7 D0 }
    202.                 return  7 v, N2 g, L( E6 W% U& L' }
    203.                
      # Q4 f* ]! s# p$ D8 _: s
    204. def main():
      * R& u/ j* B" H) q# p) U9 ]; \
    205.     timeStart = time.time()
      + t( o% O2 i# g( [& W
    206. 4 O' ]6 S3 D+ k; P# D1 B

    207. % w, P6 P  f% t' C6 `* _
    208. 5 d% J$ e# A6 o  a' d# t
    209.     path=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/test"0 x# @# U- U0 g% K' a6 ~
    210.    
      ) ~3 ^3 h, W% [$ K5 K- u
    211.     outputPath=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/output/demo.txt"
      ( t3 {5 I8 n7 `
    212.     . u) D* H& M3 R' i7 J0 k* ~
    213.     mdxFormat(path,outputPath)
      4 Z% d5 F3 R+ d

    214. : t( \4 k( e" [+ P$ B
    215.     timeEnd = time.time()
      2 X2 r: R! L0 P. ?& ?3 P! ^
    216.     print("程序运行了%d秒"%(timeEnd-timeStart))) U" J9 P/ ]. E. L  n

    217. - A) \1 ~. ?& o/ L9 ?) W
    218. if __name__ == '__main__':
      & n8 P1 E% u5 e/ x: x( x
    219.     main(): N0 \" s/ _' q% e
    复制代码

    该用户从未签到

     楼主| 发表于 2021-10-7 19:54:52 | 显示全部楼层
    漫步云海涧 发表于 2021-10-7 07:59
    4 A/ d. U. W$ s% u+ u: t9 l* e好的!!  麻烦了
    4 p& U& R" i) H  L: M* Y1 ]7 P( S
    你修改了哪条?

    该用户从未签到

     楼主| 发表于 2021-10-7 21:48:13 | 显示全部楼层
    漫步云海涧 发表于 2021-10-7 07:59
    ) d# a7 R! B) ?好的!!  麻烦了
    , G& B' c8 ^1 x: {( i; b
    path=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/test"
    * y0 `2 H/ M4 F- X& CoutputPath=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/output/demo.txt"5 v: v  f, P: N  Y+ I
    这两条有问题吧,应该是下面这个格式
    5 L8 b# r# O5 q5 mr"D:\U盘同步\百科\00txt词条汇总"
  • TA的每日心情
    擦汗
    2021-11-17 09:18
  • 签到天数: 79 天

    [LV.6]常住居民II

    发表于 2021-10-8 07:10:18 | 显示全部楼层
    muyuzhth0 发表于 2021-10-7 21:48
    ! o: d/ Q; M, D+ t: q7 Z6 `9 i0 @path=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/test"
    : p& O: ]( }( }6 B& z/ soutputPath=r"/Users/vivian/Downloads/md ...
    8 J+ A! \1 ~/ w9 B. V9 ~4 p/ q% d
    我用的是mac电脑, path 是放的存放txt词条的目录 , outputpath 是输出的txt文件
  • TA的每日心情
    开心
    2022-1-20 19:27
  • 签到天数: 157 天

    [LV.7]常住居民III

    发表于 2022-2-18 10:09:24 | 显示全部楼层
    弄个windows操作界面该多好

    该用户从未签到

     楼主| 发表于 2022-2-18 19:10:21 | 显示全部楼层
    lixiaoshun 发表于 2022-2-18 10:09
    : V0 F$ g& M+ {  H4 E. S" }弄个windows操作界面该多好

    5 v* N1 M  h4 F5 f, nsorry!算法还不完善,需要的人也不多,空闲时间比较少....暂时没有写GUI的打算
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-27 03:20 , Processed in 0.065182 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表