序文
同社は最近、いくつかのプロジェクトのソフトタイトルと特許を申請しており、申請した人は、ソフトタイトルを申請するときに
ワードコードを提出する必要があることを知っています.
朝、初めてここに来たとき、同僚に会った場所は次のとおりです。
Run_申请软著();
水を汲みに通りかかったとき、同僚がまだそこにいるのを見ました:
Run_申请软著();
トイレのそばを通りかかったとき、同僚がまだ中にいるのを見ました:
Run_申请软著();
会議のために通りかかったとき、同僚がまだそこにいるのを見ました。
Run_申请软著();
正午、私は同僚がまだ次の場所にいるのを見ました:
Run_申请软著();
…
99回以上の省略;
…
99回以上の省略;
…
夜に仕事を終えたとき、同僚がまだそこにいるのを見ました。
Run_申请软著();
説明を簡単にするために、共通部分を取り上げました。
Run_申请软著():{
项目=项目0
loop(1):
{
start:
//1.打开[项目]源码目录;
//2.打开[项目]源码中的其他子目录;
//3.找到[项目]中:{
.c,.cpp,.h,...}源码;
//3-1.打开找到的{
.c,.cpp,.h,...}源码;
//3-2.复制找到的{
.c,.cpp,.h,...}源码;
//3-3.粘贴找到的{
.c,.cpp,.h,...}源码 到 word中;
//4.调整word格式;
//5.挨个删除每一行回车换行符;
//6.挨个删除每一行空白的行;
//7.保存
end:
jump start;
}
}
パイソン:私の番です
パイソン牛鼻。
私は物事を行う前に分析することを好むので、実際にそれを行うときにエラー率も減らすことができます。
実際には、プロセスは次のとおりです。
Run_申请软著():{
项目=项目0
loop(1):
{
start:
//1.打开[项目]源码目录;
//2.打开[项目]源码中的其他子目录;
//3.找到[项目]中:{.c,.cpp,.h,...}源码;
//3-1.打开找到的{.c,.cpp,.h,...}源码;
//3-2.复制找到的{.c,.cpp,.h,...}源码;
//3-3.粘贴找到的{.c,.cpp,.h,...}源码 到 word中;
//4.调整word格式;
//5.挨个删除每一行回车换行符;
//6.挨个删除每一行空白的行;
//7.保存
end:
jump start;
}
}
ディレクトリ インターフェイスは、おおよそ次のとおりです。
zhenghui@zh-pc:/软著代码$ tree ./ |grep -E -v ".txt|.c|.h"
./
├── 项目A
│ ├── master
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ ├── slave
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ └── ui
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
├── 项目B
│ ├── master
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ ├── slave
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ └── ui
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
├── 项目C
│ ├── master
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ ├── slave
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
│ └── ui
│ │ ├── a.c
│ │ ├── a.h
│ │ ├── b.cpp
└── └──
芯:
1. 以前はエンコーディング スタイルが統一されていなかったため、エンコーディング タイプが異なり、UTF-8、GB2312、Windows-1254、Windows-1252、GBK などのエンコーディング フォーマットが生成され、Python が処理できないデータが生成されました。を直接解析するには、エンコード形式を手動で指定する必要があります. 神よ、非常に多くのコードを手動で指定します.
まず、ファイルに応じて、次のファイルのエンコード タイプを判断します。
# 获取文件类型
def get_files_encoding_type(file_dir):
# 判断文件的编码类型
enc = ""
with open(file_dir, 'rb') as file:
# 验证该文件的字符编码类型
encoding_message = chardet.detect(file.read())
enc = encoding_message['encoding']
# GB2312,GBK,GB18030,是兼容的,包含的字符个数:GB2312 < GBK < GB18030
# "Windows-1254" and "Windows-1252" 也统一让gb18030处理,后面需要抑制一下报错
if enc == "GB2312" or enc == "GBK" or enc == "Windows-1254" or enc == "Windows-1252":
enc = "gb18030"
return enc
次に、ファイルを読み取るときに、次のエラーを抑制します。
# 读源代码文件 errors='ignore':忽略报错
file = open(read_dir, 'r', encoding=enc, errors='ignore')
2. ソースコード内に .ini、.txt、makefile などの設定ファイルが含まれている可能性がありますが、必要ないので、次のように判断する必要があります。
# 判断是否为想要的文件格式
def verify_file_type(file_path):
flag = False
# 判断文件后缀
file_suffix = os.path.splitext(file_path)[-1] # .c/.h/.cpp
if file_suffix == ".h" or file_suffix == ".c" or file_suffix == ".cpp":
flag = True
return flag
完全なコード:
```python
# -*- coding: UTF-8 -*-
import os
import chardet
# 是否输出文件名
# _printf_src_name = False
_printf_src_name = True
# 获取文件类型
def get_files_encoding_type(file_dir):
# 判断文件的编码类型
enc = ""
with open(file_dir, 'rb') as file:
# 验证该文件的字符编码类型
encoding_message = chardet.detect(file.read())
enc = encoding_message['encoding']
# GB2312,GBK,GB18030,是兼容的,包含的字符个数:GB2312 < GBK < GB18030
# "Windows-1254" and "Windows-1252" 也统一让gb18030处理,后面需要抑制一下报错
if enc == "GB2312" or enc == "GBK" or enc == "Windows-1254" or enc == "Windows-1252":
enc = "gb18030"
return enc
# 读取文件并写入新文件
def read_and_write_file(read_dir, enc, save_file):
# 是否在首行写入源代码名字
if _printf_src_name:
dirarray = read_dir.split("/")
curr_save_file_name = dirarray[len(dirarray) - 1]
# 第一行写入源代码文件的名字
save_file.write(("//"+ curr_save_file_name +":").encode())
save_file.write("\n".encode())
# 读源代码文件 errors='ignore':忽略报错
file = open(read_dir, 'r', encoding=enc, errors='ignore')
for line in file:
if (len(line) > 0):
# 跳过空行
if line.isspace() == False:
# 替换换行符
res = line.replace('\n', '')
# write file
save_file.write(res.encode())
save_file.write("\n".encode())
# 判断是否为想要的文件格式
def verify_file_type(file_path):
flag = False
# 判断文件后缀
file_suffix = os.path.splitext(file_path)[-1] # .c/.h/.cpp
if file_suffix == ".h" or file_suffix == ".c" or file_suffix == ".cpp":
flag = True
return flag
# 递归遍历目录
def traversal_files_save_txt(dir_path, save_file):
for dir in os.listdir(dir_path):
dir = os.path.join(dir_path, dir)
# 判断当前目录是否为文件
if os.path.isfile(dir):
# 判断文件后缀
if verify_file_type(dir):
# 判断文件的编码类型,
enc = get_files_encoding_type(dir)
if enc == "":
continue;
# 写文件
read_and_write_file(dir, enc, save_file)
else:
print(dir, "不支持,该文件不是源代码文件")
# 判断当前目录是否为文件夹
if os.path.isdir(dir):
traversal_files_save_txt(dir, save_file)
def traversal_files_to_txt(dir_path):
for dir in os.listdir(dir_path):
# 如果是目录就以目录的名字创建一个txt文件存储这个目录中的代码
save_file_name = dir + ".txt"
if _printf_src_name:
save_file_name = dir + "-首行带源文件名.txt"
save_dir = os.path.join(dir_path, dir)
if os.path.isdir(save_dir):
save_txt_file = os.path.join(dir_path, save_file_name)
print("save_path=", save_dir, save_txt_file)
# open save file text
save_file = open(save_txt_file, 'wb+')
# write .c .cpp .h to txt file
traversal_files_save_txt(save_dir, save_file)
if __name__ == '__main__':
dir_path = r'./软著代码/'
traversal_files_to_txt(dir_path)