Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,7 +6,7 @@ import pandas as pd
|
|
| 6 |
# Các biến toàn cục
|
| 7 |
OUTPUT_FILE_TXT = "output.txt"
|
| 8 |
OUTPUT_FILE_XLSX = "output.xlsx"
|
| 9 |
-
TEMP_FILE = "temp.txt" #
|
| 10 |
|
| 11 |
def write_file(file_path, data):
|
| 12 |
with open(file_path, 'w', encoding='utf-8') as file:
|
|
@@ -43,7 +43,7 @@ def split_emails(input_data, uploaded_file):
|
|
| 43 |
if match:
|
| 44 |
gmail_addresses.append(match.group(1) + '\n')
|
| 45 |
|
| 46 |
-
#
|
| 47 |
write_file(TEMP_FILE, [line + '\n' for line in lines])
|
| 48 |
|
| 49 |
output_data = "".join(gmail_addresses)
|
|
@@ -75,71 +75,27 @@ def fill_missing_parts(input_data, uploaded_file):
|
|
| 75 |
output_total = count_emails(output_data)
|
| 76 |
return f"Đã lưu kết quả.", gr.update(value=data, label=f"Input Text (Total: {input_total})"), gr.update(value=output_data, label=f"Output Text (Total: {output_total})"), None
|
| 77 |
|
| 78 |
-
def clear_input(input_data, output_data, uploaded_file):
|
| 79 |
-
return "", gr.update(value="", label="Input Text (Total: 0)"), gr.update(value=output_data, label=f"Output Text (Total: {count_emails(output_data)})"), None, "Đã xóa input."
|
| 80 |
-
|
| 81 |
-
def clear_output(input_data, output_data, uploaded_file):
|
| 82 |
-
if os.path.exists(OUTPUT_FILE_TXT):
|
| 83 |
-
os.remove(OUTPUT_FILE_TXT)
|
| 84 |
-
if os.path.exists(OUTPUT_FILE_XLSX):
|
| 85 |
-
os.remove(OUTPUT_FILE_XLSX)
|
| 86 |
-
return "Đã xóa output.", gr.update(value=input_data, label=f"Input Text (Total: {count_emails(input_data)})"), gr.update(value="", label="Output Text (Total: 0)"), None
|
| 87 |
-
|
| 88 |
def clear_files():
|
| 89 |
# Chỉ xóa output files, không xóa TEMP_FILE
|
| 90 |
for file_path in [OUTPUT_FILE_TXT, OUTPUT_FILE_XLSX]:
|
| 91 |
if os.path.exists(file_path):
|
| 92 |
os.remove(file_path)
|
| 93 |
-
return "Đã xóa các file output.", gr.update(value="", label="Input Text (Total: 0)"), gr.update(value="", label="Output Text (Total: 0)"), None
|
| 94 |
-
|
| 95 |
-
def download_output(input_data, output_data, uploaded_file):
|
| 96 |
-
if not output_data:
|
| 97 |
-
if os.path.exists(OUTPUT_FILE_TXT):
|
| 98 |
-
os.remove(OUTPUT_FILE_TXT)
|
| 99 |
-
if os.path.exists(OUTPUT_FILE_XLSX):
|
| 100 |
-
os.remove(OUTPUT_FILE_XLSX)
|
| 101 |
-
return "Không có dữ liệu để tải.", gr.update(label=f"Input Text (Total: {count_emails(input_data)})"), gr.update(label=f"Output Text (Total: {count_emails(output_data)})"), None
|
| 102 |
-
|
| 103 |
-
write_file(OUTPUT_FILE_TXT, output_data.splitlines(keepends=True))
|
| 104 |
-
|
| 105 |
-
lines = output_data.splitlines()
|
| 106 |
-
data_rows = []
|
| 107 |
-
for line in lines:
|
| 108 |
-
if line.strip():
|
| 109 |
-
separator = re.search(r'[\t|;:]', line)
|
| 110 |
-
if separator:
|
| 111 |
-
sep_char = separator.group()
|
| 112 |
-
parts = line.strip().split(sep_char)
|
| 113 |
-
data_rows.append([part.strip() for part in parts])
|
| 114 |
-
else:
|
| 115 |
-
data_rows.append([line.strip()])
|
| 116 |
-
|
| 117 |
-
df = pd.DataFrame(data_rows)
|
| 118 |
-
df.to_excel(OUTPUT_FILE_XLSX, index=False, header=False)
|
| 119 |
-
|
| 120 |
-
return ("Đã tạo file output.txt và output.xlsx.",
|
| 121 |
-
gr.update(label=f"Input Text (Total: {count_emails(input_data)})"),
|
| 122 |
-
gr.update(label=f"Output Text (Total: {count_emails(output_data)})"),
|
| 123 |
-
[OUTPUT_FILE_TXT, OUTPUT_FILE_XLSX])
|
| 124 |
|
| 125 |
-
# Giao diện Gradio
|
| 126 |
with gr.Blocks(title="Email Processor Pro", theme=gr.themes.Soft()) as demo:
|
| 127 |
with gr.Row(equal_height=True):
|
| 128 |
with gr.Column(scale=1):
|
| 129 |
input_text = gr.Textbox(label="Input Text", lines=10,
|
| 130 |
-
placeholder="Nhập dữ liệu hoặc tải file .txt lên...
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
with gr.Row():
|
| 134 |
-
clear_input_btn = gr.Button("🧹 Clear Input")
|
| 135 |
|
| 136 |
with gr.Column(scale=1):
|
| 137 |
output_text = gr.Textbox(label="Output Text", lines=10, interactive=False)
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
clear_output_btn = gr.Button("🧹 Clear Output")
|
| 142 |
-
download_btn = gr.Button("💾 Download Output")
|
| 143 |
|
| 144 |
status = gr.Textbox(label="🔄 Status", interactive=False)
|
| 145 |
|
|
@@ -149,15 +105,14 @@ with gr.Blocks(title="Email Processor Pro", theme=gr.themes.Soft()) as demo:
|
|
| 149 |
split_btn = gr.Button("✂️ Split Emails")
|
| 150 |
fill_btn = gr.Button("🔍 Fill Missing")
|
| 151 |
|
| 152 |
-
|
| 153 |
-
clear_files_btn = gr.Button("🧹 Clear All Data", size="lg")
|
| 154 |
|
| 155 |
# Kết nối sự kiện
|
| 156 |
split_btn.click(split_emails, inputs=[input_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 157 |
fill_btn.click(fill_missing_parts, inputs=[input_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 158 |
-
clear_files_btn.click(clear_files, outputs=[status, input_text, output_text, download_file
|
| 159 |
-
clear_input_btn.click(
|
| 160 |
-
clear_output_btn.click(
|
| 161 |
download_btn.click(download_output, inputs=[input_text, output_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 162 |
|
| 163 |
demo.launch()
|
|
|
|
| 6 |
# Các biến toàn cục
|
| 7 |
OUTPUT_FILE_TXT = "output.txt"
|
| 8 |
OUTPUT_FILE_XLSX = "output.xlsx"
|
| 9 |
+
TEMP_FILE = "temp.txt" # File tạm lưu dữ liệu gốc
|
| 10 |
|
| 11 |
def write_file(file_path, data):
|
| 12 |
with open(file_path, 'w', encoding='utf-8') as file:
|
|
|
|
| 43 |
if match:
|
| 44 |
gmail_addresses.append(match.group(1) + '\n')
|
| 45 |
|
| 46 |
+
# Ghi đè dữ liệu gốc vào file temp.txt
|
| 47 |
write_file(TEMP_FILE, [line + '\n' for line in lines])
|
| 48 |
|
| 49 |
output_data = "".join(gmail_addresses)
|
|
|
|
| 75 |
output_total = count_emails(output_data)
|
| 76 |
return f"Đã lưu kết quả.", gr.update(value=data, label=f"Input Text (Total: {input_total})"), gr.update(value=output_data, label=f"Output Text (Total: {output_total})"), None
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
def clear_files():
|
| 79 |
# Chỉ xóa output files, không xóa TEMP_FILE
|
| 80 |
for file_path in [OUTPUT_FILE_TXT, OUTPUT_FILE_XLSX]:
|
| 81 |
if os.path.exists(file_path):
|
| 82 |
os.remove(file_path)
|
| 83 |
+
return "Đã xóa các file output.", gr.update(value="", label="Input Text (Total: 0)"), gr.update(value="", label="Output Text (Total: 0)"), None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
|
| 85 |
+
# Giao diện Gradio (chỉ giữ lại 2 tab chính)
|
| 86 |
with gr.Blocks(title="Email Processor Pro", theme=gr.themes.Soft()) as demo:
|
| 87 |
with gr.Row(equal_height=True):
|
| 88 |
with gr.Column(scale=1):
|
| 89 |
input_text = gr.Textbox(label="Input Text", lines=10,
|
| 90 |
+
placeholder="Nhập dữ liệu hoặc tải file .txt lên...")
|
| 91 |
+
upload_file = gr.File(label="📤 Upload File (.txt)", file_types=[".txt"])
|
| 92 |
+
clear_input_btn = gr.Button("🧹 Clear Input")
|
|
|
|
|
|
|
| 93 |
|
| 94 |
with gr.Column(scale=1):
|
| 95 |
output_text = gr.Textbox(label="Output Text", lines=10, interactive=False)
|
| 96 |
+
download_file = gr.File(label="📥 Download Files", interactive=False, file_count="multiple")
|
| 97 |
+
clear_output_btn = gr.Button("🧹 Clear Output")
|
| 98 |
+
download_btn = gr.Button("💾 Download Output")
|
|
|
|
|
|
|
| 99 |
|
| 100 |
status = gr.Textbox(label="🔄 Status", interactive=False)
|
| 101 |
|
|
|
|
| 105 |
split_btn = gr.Button("✂️ Split Emails")
|
| 106 |
fill_btn = gr.Button("🔍 Fill Missing")
|
| 107 |
|
| 108 |
+
clear_files_btn = gr.Button("🧹 Clear All Data", size="lg")
|
|
|
|
| 109 |
|
| 110 |
# Kết nối sự kiện
|
| 111 |
split_btn.click(split_emails, inputs=[input_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 112 |
fill_btn.click(fill_missing_parts, inputs=[input_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 113 |
+
clear_files_btn.click(clear_files, outputs=[status, input_text, output_text, download_file])
|
| 114 |
+
clear_input_btn.click(lambda: ["", gr.update(value="", label="Input Text (Total: 0)"), gr.update(value="", label="Output Text (Total: 0)"), None, "Đã xóa input."], outputs=[input_text, input_text, output_text, upload_file, status])
|
| 115 |
+
clear_output_btn.click(clear_files, outputs=[status, input_text, output_text, download_file])
|
| 116 |
download_btn.click(download_output, inputs=[input_text, output_text, upload_file], outputs=[status, input_text, output_text, download_file])
|
| 117 |
|
| 118 |
demo.launch()
|