suprimedev commited on
Commit
750e443
·
verified ·
1 Parent(s): c487172

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +156 -0
app.py ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import chardet
3
+ import mimetypes
4
+ import pandas as pd
5
+ import json
6
+ import yaml
7
+ import toml
8
+ import configparser
9
+ import xml.etree.ElementTree as ET
10
+ from pathlib import Path
11
+
12
+ def read_file(file):
13
+ if file is None:
14
+ return "لطفا یک فایل انتخاب کنید"
15
+
16
+ try:
17
+ file_path = file.name
18
+ file_extension = Path(file_path).suffix.lower().strip('.')
19
+
20
+ # ابتدا با MIME type بررسی می‌کنیم
21
+ mime_type, _ = mimetypes.guess_type(file_path)
22
+
23
+ # اگر فایل صوتی یا تصویری باشد
24
+ if mime_type and (mime_type.startswith('audio/') or mime_type.startswith('image/') or mime_type.startswith('video/')):
25
+ return f"فایل‌های صوتی، تصویری و ویدیویی پشتیبانی نمی‌شوند. (MIME: {mime_type})"
26
+
27
+ # فایل‌های باینری معروف که نباید خوانده شوند
28
+ binary_extensions = {
29
+ 'exe', 'dll', 'so', 'dylib', 'bin', 'dat', 'db', 'sqlite',
30
+ 'zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz',
31
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'svg', 'webp',
32
+ 'mp3', 'mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm',
33
+ 'wav', 'flac', 'aac', 'ogg', 'wma', 'm4a',
34
+ 'pdf', 'doc', 'ppt', 'pptx', 'odt', 'ods', 'odp'
35
+ }
36
+
37
+ if file_extension in binary_extensions:
38
+ return f"فرمت فایل .{file_extension} یک فایل باینری است و پشتیبانی نمی‌شود"
39
+
40
+ # فایل‌های Excel
41
+ if file_extension in ['xlsx', 'xls', 'xlsm', 'xlsb']:
42
+ df = pd.read_excel(file_path)
43
+ return f"=== محتوای Excel ===\n{df.to_string()}"
44
+
45
+ # فایل‌های CSV و TSV
46
+ elif file_extension in ['csv', 'tsv']:
47
+ separator = '\t' if file_extension == 'tsv' else ','
48
+ df = pd.read_csv(file_path, sep=separator)
49
+ return f"=== محتوای {file_extension.upper()} ===\n{df.to_string()}"
50
+
51
+ # فایل‌های JSON
52
+ elif file_extension == 'json':
53
+ with open(file_path, 'r', encoding='utf-8') as f:
54
+ data = json.load(f)
55
+ return f"=== محتوای JSON ===\n{json.dumps(data, indent=2, ensure_ascii=False)}"
56
+
57
+ # فایل‌های YAML
58
+ elif file_extension in ['yaml', 'yml']:
59
+ with open(file_path, 'r', encoding='utf-8') as f:
60
+ data = yaml.safe_load(f)
61
+ return f"=== محتوای YAML ===\n{yaml.dump(data, allow_unicode=True, default_flow_style=False)}"
62
+
63
+ # فایل‌های TOML
64
+ elif file_extension == 'toml':
65
+ with open(file_path, 'r', encoding='utf-8') as f:
66
+ data = toml.load(f)
67
+ return f"=== محتوای TOML ===\n{toml.dumps(data)}"
68
+
69
+ # فایل‌های INI/CFG
70
+ elif file_extension in ['ini', 'cfg', 'conf', 'config']:
71
+ config = configparser.ConfigParser()
72
+ config.read(file_path, encoding='utf-8')
73
+ output = f"=== محتوای {file_extension.upper()} ===\n"
74
+ for section in config.sections():
75
+ output += f"\n[{section}]\n"
76
+ for key, value in config.items(section):
77
+ output += f"{key} = {value}\n"
78
+ return output
79
+
80
+ # فایل‌های XML
81
+ elif file_extension == 'xml':
82
+ tree = ET.parse(file_path)
83
+ root = tree.getroot()
84
+ return f"=== محتوای XML ===\n{ET.tostring(root, encoding='unicode')}"
85
+
86
+ # سایر فایل‌ها - تلاش برای خواندن به عنوان متن
87
+ else:
88
+ # تشخیص encoding
89
+ with open(file_path, 'rb') as f:
90
+ raw_data = f.read(10000) # فقط 10KB اول برای تشخیص
91
+ result = chardet.detect(raw_data)
92
+ encoding = result['encoding'] if result['encoding'] else 'utf-8'
93
+ confidence = result['confidence'] if 'confidence' in result else 0
94
+
95
+ # اگر احتمال encoding کم باشد، احتمالا فایل باینری است
96
+ if confidence < 0.7:
97
+ try:
98
+ # تلاش با UTF-8
99
+ with open(file_path, 'r', encoding='utf-8') as f:
100
+ content = f.read()
101
+ return f"=== محتوای فایل (UTF-8) ===\n{content}"
102
+ except UnicodeDecodeError:
103
+ return "این فایل احتمالاً باینری است یا encoding آن قابل تشخیص نیست"
104
+
105
+ # خواندن با encoding تشخیص داده شده
106
+ try:
107
+ with open(file_path, 'r', encoding=encoding) as f:
108
+ content = f.read()
109
+ return f"=== محتوای فایل ({encoding}) ===\n{content}"
110
+ except:
111
+ # تلاش نهایی با encodings مختلف
112
+ for enc in ['utf-8', 'utf-16', 'latin-1', 'windows-1252', 'cp1256']:
113
+ try:
114
+ with open(file_path, 'r', encoding=enc) as f:
115
+ content = f.read()
116
+ return f"=== محتوای فایل ({enc}) ===\n{content}"
117
+ except:
118
+ continue
119
+
120
+ return "نمی‌توان این فایل را خواند. احتمالاً فایل باینری است."
121
+
122
+ except Exception as e:
123
+ return f"خطا در خواندن فایل: {str(e)}"
124
+
125
+ # لیست فرمت‌های پشتیبانی شده
126
+ supported_formats = """
127
+ **فرمت‌های پشتیبانی شده:**
128
+ - فایل‌های متنی: .txt, .log, .md, .rst, .tex
129
+ - کدهای برنامه‌نویسی: .py, .js, .ts, .java, .cpp, .c, .h, .cs, .rb, .go, .rs, .swift, .kt, .scala, .r, .m, .php, .pl, .lua, .sh, .bat, .ps1
130
+ - فایل‌های وب: .html, .htm, .css, .scss, .sass, .less, .jsx, .tsx, .vue
131
+ - فایل‌های پیکربندی: .json, .yaml, .yml, .toml, .ini, .cfg, .conf, .config, .env, .properties
132
+ - فایل‌های داده: .csv, .tsv, .xml
133
+ - فایل‌های Office: .xlsx, .xls (نیاز به محتوای متنی)
134
+ - و بسیاری فرمت‌های متنی دیگر...
135
+
136
+ **فرمت‌های پشتیبانی نشده:**
137
+ - تصاویر: .jpg, .png, .gif, .bmp, و...
138
+ - صوت: .mp3, .wav, .flac, و...
139
+ - ویدیو: .mp4, .avi, .mkv, و...
140
+ - فایل‌های فشرده: .zip, .rar, .tar, و...
141
+ - فایل‌های باینری: .exe, .dll, .bin, و...
142
+ """
143
+
144
+ # رابط کاربری Gradio
145
+ iface = gr.Interface(
146
+ fn=read_file,
147
+ inputs=gr.File(label="فایل را انتخاب کنید", file_types=None),
148
+ outputs=gr.Textbox(label="محتوای فایل", lines=25, max_lines=100),
149
+ title="خواننده جامع فایل‌های متنی",
150
+ description="تقریباً هر فایل متنی را آپلود کنید تا محتوای آن را مشاهده کنید\n" + supported_formats,
151
+ examples=[],
152
+ theme="soft"
153
+ )
154
+
155
+ if __name__ == "__main__":
156
+ iface.launch()