This commit is contained in:
“ddf” 2024-12-24 16:10:56 +08:00
parent e4f3a4981f
commit 725b0542af
2 changed files with 145 additions and 28 deletions

View File

@ -0,0 +1,72 @@
import os
import logging
# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
directory_path = r'D:\Dp10RepoV1\项目代码\D10xhGemei\T02贸易汇总仓库'
# 定义替换列表
replacements = [
('支序', '卷号'),
('支数', '匹数')
]
def replace_in_file(file_path, replacements, encodings=['utf-8', 'gbk']):
temp_file_path = file_path + '.tmp'
try:
# 尝试使用提供的编码列表打开文件
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as infile, \
open(temp_file_path, 'w', encoding=encoding) as outfile:
# 读取整个文件内容到一个字符串中
file_content = infile.read()
# 对文件内容进行所有替换操作
for old, new in replacements:
file_content = file_content.replace(old, new)
# 将替换后的内容写回临时文件
outfile.write(file_content)
# 使用os.replace原子性地替换原文件
os.replace(temp_file_path, file_path)
logging.info(f"Successfully processed file: {file_path} using encoding {encoding}")
break # 成功处理后跳出循环
except UnicodeDecodeError:
# 如果当前编码失败,则尝试下一个编码
logging.warning(f"Failed to decode file {file_path} using encoding {encoding}")
else:
# 如果所有编码都失败,则记录错误并删除临时文件(如果存在)
logging.error(f"Failed to process file {file_path} with all provided encodings")
if os.path.exists(temp_file_path):
os.remove(temp_file_path)
except Exception as e:
logging.error(f"Error processing file {file_path}: {e}")
if os.path.exists(temp_file_path):
os.remove(temp_file_path)
def convert_to_unicode(replacements):
unicode_replacements = []
for original, replacement in replacements:
# 将每个字符转换为Unicode编码
original_unicode = ''.join(f'#{ord(char)}' for char in original)
replacement_unicode = ''.join(f'#{ord(char)}' for char in replacement)
unicode_replacements.append((original_unicode, replacement_unicode))
return unicode_replacements
def replace_in_folder(folder_path, replacements, encodings=['utf-8', 'gbk']):
for root, dirs, files in os.walk(folder_path):
for file_name in files:
if file_name.endswith('.dfm'):
file_path = os.path.join(root, file_name)
replace_in_file(file_path, replacements, encodings)
# 执行替换操作
replace_in_folder(directory_path, convert_to_unicode(replacements) )

View File

@ -1,6 +1,9 @@
import os
import logging
import chardet # pip install chardet
# 替换为你的目录路径
directory_path = r'D:\Dp10RepoV1\项目代码\D10myWeiao' # T01贸易生产计划 T02贸易汇总仓库
# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@ -69,46 +72,88 @@ replacements = [
]
def replace_in_file(file_path, replacements, encodings=['utf-8', 'gbk']):
def replace_in_file(file_path, replacements):
temp_file_path = file_path + '.tmp'
try:
# 尝试使用提供的编码列表打开文件
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as infile, \
open(temp_file_path, 'w', encoding=encoding) as outfile:
# 读取整个文件内容到一个字符串中
file_content = infile.read()
# 对文件内容进行所有替换操作
for old, new in replacements:
file_content = file_content.replace(old, new)
# 将替换后的内容写回临时文件
outfile.write(file_content)
# 使用os.replace原子性地替换原文件
os.replace(temp_file_path, file_path)
logging.info(f"Successfully processed file: {file_path} using encoding {encoding}")
break # 成功处理后跳出循环
except UnicodeDecodeError:
# 如果当前编码失败,则尝试下一个编码
logging.warning(f"Failed to decode file {file_path} using encoding {encoding}")
else:
# 如果所有编码都失败,则记录错误并删除临时文件(如果存在)
logging.error(f"Failed to process file {file_path} with all provided encodings")
if os.path.exists(temp_file_path):
os.remove(temp_file_path)
# 使用chardet检测文件编码
with open(file_path, 'rb') as infile:
raw_data = infile.read()
detected_encoding = chardet.detect(raw_data)['encoding']
with open(file_path, 'r', encoding=detected_encoding) as infile, \
open(temp_file_path, 'w', encoding=detected_encoding) as outfile:
# 读取整个文件内容到一个字符串中
file_content = infile.read()
# 对文件内容进行所有替换操作
for old, new in replacements:
file_content = file_content.replace(old, new)
# 将替换后的内容写回临时文件
outfile.write(file_content)
# 使用os.replace原子性地替换原文件
os.replace(temp_file_path, file_path)
logging.info(f"Successfully processed file: {file_path} using encoding {detected_encoding}")
except Exception as e:
logging.error(f"Error processing file {file_path}: {e}")
if os.path.exists(temp_file_path):
os.remove(temp_file_path)
def replace_in_folder(folder_path, replacements, encodings=['utf-8', 'gbk']):
# =========================================批处理上述运行后出现逗号紧挨着分号的情况==============================
def remove_empty_lines_in_first_50_lines(filename):
with open(filename, 'rb') as file:
raw_data = file.read()
detected_encoding = chardet.detect(raw_data)['encoding']
with open(filename, 'r', encoding=detected_encoding) as file:
lines = file.readlines()
non_empty_lines = [line for line in lines[:50] if line.strip() != '']
with open(filename, 'w', encoding=detected_encoding) as file:
file.writelines(non_empty_lines + lines[50:])
def remove_single_semicolon_lines(filename):
with open(filename, 'rb') as file:
raw_data = file.read()
detected_encoding = chardet.detect(raw_data)['encoding']
with open(filename, 'r', encoding=detected_encoding) as file:
lines = file.readlines()
non_single_semicolon_lines = [line for line in lines if line.strip() != ';' and line.strip() != '']
with open(filename, 'w', encoding=detected_encoding) as file:
file.writelines(non_single_semicolon_lines)
def modify_last_comma_line(filename):
with open(filename, 'rb') as file:
raw_data = file.read()
detected_encoding = chardet.detect(raw_data)['encoding']
with open(filename, 'r', encoding=detected_encoding) as file:
lines = file.readlines()
if len(lines) > 50:
first_50_lines = lines[:50]
# 找到仅包含 "type" 的行
type_lines = [line for line in first_50_lines if "type" in line]
if type_lines:
# 获取 "type" 行的上一行
last_type_line_index = first_50_lines.index(type_lines[-1]) - 1
last_type_line = first_50_lines[last_type_line_index]
if last_type_line.strip().endswith(','):
# 找到最后一个逗号的位置
last_comma_index = last_type_line.rfind(',')
# 将最后一个逗号替换为分号
lines[lines.index(last_type_line)] = last_type_line[:last_comma_index] + ';\n'
with open(filename, 'w', encoding=detected_encoding) as file:
file.writelines(lines)
def replace_in_folder(folder_path, replacements):
for root, dirs, files in os.walk(folder_path):
for file_name in files:
if file_name.endswith('.pas'):
file_path = os.path.join(root, file_name)
replace_in_file(file_path, replacements, encodings)
replace_in_file(file_path, replacements)
remove_empty_lines_in_first_50_lines(file_path)
remove_single_semicolon_lines(file_path)
modify_last_comma_line(file_path)
# 执行替换操作
replace_in_folder(r'D:\Dp10Repo\项目代码\D10gmXinde', replacements)
replace_in_folder(directory_path, replacements)