[Python]文件转码 统计代码行数

Java code:

  
  
  
  
  1. ''''' 
  2. Created on 2012-11-23 
  3.  
  4. @author: User 
  5. ''' 
  6.  
  7. import os 
  8. import stat 
  9. import shutil 
  10. import traceback 
  11. from chardet.universaldetector import UniversalDetector 
  12.  
  13.  
  14. SPACE = 5 
  15. DEBUG = True 
  16.  
  17. def main(): 
  18.     #convertMatchedFilesEncoding(os.getcwd(), "GBK", "UTF-8", [".py"], True, True) 
  19.     #countMatchedFilesLines(os.getcwd(),[".py"], True) 
  20.     #deleteFiles(os.getcwd(), [".bak"], True) 
  21.     fileinfos = getFilesEncoding(os.getcwd(), [".java"], True
  22.     for info in fileinfos: 
  23.         print(info) 
  24.     #autoConvertFilesEncoding(os.getcwd(), "UTF-8", [".java"], True) 
  25.     pass 
  26.  
  27. def logPrint(value, *args): 
  28.     if DEBUG: 
  29.         print(value, *args) 
  30.  
  31. def getFileEncoding(path): 
  32.     try
  33.         file = open(path, "rb"
  34.         detector = UniversalDetector() 
  35.         detector.reset() 
  36.         for line in file.readlines(): 
  37.             detector.feed(line) 
  38.             if detector.done: 
  39.                 break 
  40.         detector.close() 
  41.         return detector.result 
  42.     except Exception as err: 
  43.         logPrint("detect file encoding failed,file:%s.\ncause:%s"%(path, err)) 
  44.     finally
  45.         if "file" in locals(): 
  46.             file.close() 
  47.  
  48. def getFilesEncoding(path, fileTypes, subFile = False): 
  49.     result = [] 
  50.     def getMatchedFilesEncoding(path, fileTypes, subFile): 
  51.         files = os.listdir(path) 
  52.         for file in files: 
  53.             file = os.path.join(path, file) 
  54.             if os.path.isfile(file) and isFileMatched(file, fileTypes): 
  55.                 fileEncodingInfo = getFileEncoding(file) 
  56.                 fileEncodingInfo["path"] = file 
  57.                 result.append(fileEncodingInfo) 
  58.             elif os.path.isdir(file) and subFile: 
  59.                 getMatchedFilesEncoding(file, fileTypes, subFile) 
  60.  
  61.     getMatchedFilesEncoding(path, fileTypes, subFile) 
  62.     return result 
  63.  
  64. def autoConvertFileEncoding(path, targetEncoding, backup = False): 
  65.     if os.path.isfile(path): 
  66.         fileEncodingInfo = getFileEncoding(path) 
  67.         encoding = fileEncodingInfo["encoding"
  68.         convertFileEncoding(path, encoding, targetEncoding, backup) 
  69.  
  70. def autoConvertFilesEncoding(path, targetEncoding, fileTypes, subFile = False, backup = False): 
  71.     files = os.listdir(path) 
  72.     for file in files: 
  73.         file = os.path.join(path, file) 
  74.         if os.path.isfile(file) and isFileMatched(file, fileTypes): 
  75.             autoConvertFileEncoding(file, targetEncoding, backup) 
  76.         elif os.path.isdir(file) and subFile: 
  77.             autoConvertFilesEncoding(file, targetEncoding, fileTypes, subFile, backup) 
  78.  
  79. def convertFileEncoding(path, sourceEncoding, targetEncoding, backup = False): 
  80.     try
  81.         if backup: 
  82.             shutil.copyfile(path, path + ".bak"
  83.              
  84.         sourceFile = open(path, "r", encoding = sourceEncoding) 
  85.         lines = sourceFile.readlines() 
  86.         print(lines) 
  87.         if sourceEncoding.upper() == "UTF-8" and lines[0].startswith("\ufeff"): 
  88.             lines[0] = lines[0][1:] 
  89.         targetFile = open(path + ".temp""w", encoding = targetEncoding) 
  90.         targetFile.writelines(lines) 
  91.     except Exception as err: 
  92.         #logPrint(traceback.format_exc()) 
  93.         logPrint("convert file encoding failed,file:%s.\ncause:%s"%(path, err)) 
  94.     finally
  95.         if "sourceFile" in locals(): 
  96.             sourceFile.close() 
  97.         if "targetFile" in locals(): 
  98.             targetFile.close() 
  99.              
  100.         if os.path.exists(path + ".temp"): 
  101.             deleteFile(path) 
  102.             os.rename(path + ".temp", path) 
  103.  
  104. def convertFilesEncoding(path, sourceEncoding, targetEncoding, fileTypes, subFile = False, backup = False): 
  105.     files = os.listdir(path) 
  106.     for file in files: 
  107.         file = os.path.join(path, file) 
  108.         if os.path.isfile(file) and isFileMatched(file, fileTypes): 
  109.             convertFileEncoding(file, sourceEncoding, targetEncoding, backup) 
  110.         elif os.path.isdir(file) and subFile: 
  111.             convertFilesEncoding(file, sourceEncoding, targetEncoding, fileTypes, subFile, backup) 
  112.  
  113. def countFileLines(path): 
  114.     line = 0 
  115.     if os.path.isfile(path): 
  116.         sourceFile = open(path, "rb"
  117.         lines = sourceFile.readlines() 
  118.         lines = [x for x in lines if x.strip()] 
  119.         line = len(lines) 
  120.     return line 
  121.  
  122. def countFilesLines(path, fileTypes, subFile = False): 
  123.     result = [] 
  124.     def countMatchedFilesLines(path, fileTypes, subFile): 
  125.         files = os.listdir(path) 
  126.         for file in files: 
  127.             file = os.path.join(path, file) 
  128.             if os.path.isfile(file) and isFileMatched(file, fileTypes): 
  129.                 result.append({"path":file, "lines":countFileLines(file)}) 
  130.             elif os.path.isdir(file) and subFile: 
  131.                 countMatchedFilesLines(file, fileTypes, subFile) 
  132.     countMatchedFilesLines(path, fileTypes, subFile) 
  133.     return result 
  134.  
  135.  
  136. def getFileType(path): 
  137.     fileType = None 
  138.     if os.path.isfile(path): 
  139.         baseName = os.path.basename(path) 
  140.         lastIndex = baseName.rfind("."
  141.         if lastIndex != -1
  142.             fileType = baseName[lastIndex:] 
  143.     return fileType 
  144.  
  145.  
  146. def isFileMatched(path, fileTypes): 
  147.     result = False 
  148.     fileType = getFileType(path) 
  149.     if fileTypes and fileType: 
  150.         if (type(fileTypes) == list or type(fileTypes) == tuple or type(fileTypes) == set) and (fileType in fileTypes): 
  151.             result = True 
  152.     return result        
  153.   
  154.  
  155. def deleteFile(path): 
  156.     if os.path.isfile(path): 
  157.         os.chmod(path, stat.S_IWRITE) 
  158.         os.remove(path) 
  159.  
  160. def deleteFiles(path, fileTypes, subFile = False): 
  161.     files = os.listdir(path) 
  162.     for file in files: 
  163.         file = os.path.join(path, file) 
  164.         if os.path.isfile(file) and isFileMatched(file, fileTypes): 
  165.             deleteFile(file, fileTypes) 
  166.         elif os.path.isdir(file) and subFile: 
  167.             deleteFiles(file, fileTypes, subFile) 
  168.                          
  169.                      
  170. if __name__ == '__main__'
  171.     main() 


 

 

你可能感兴趣的:(统计,转码)