filereader / app.py
suprimedev's picture
Create app.py
750e443 verified
import gradio as gr
import chardet
import mimetypes
import pandas as pd
import json
import yaml
import toml
import configparser
import xml.etree.ElementTree as ET
from pathlib import Path
def read_file(file):
if file is None:
return "لطفا یک فایل انتخاب کنید"
try:
file_path = file.name
file_extension = Path(file_path).suffix.lower().strip('.')
# ابتدا با MIME type بررسی می‌کنیم
mime_type, _ = mimetypes.guess_type(file_path)
# اگر فایل صوتی یا تصویری باشد
if mime_type and (mime_type.startswith('audio/') or mime_type.startswith('image/') or mime_type.startswith('video/')):
return f"فایل‌های صوتی، تصویری و ویدیویی پشتیبانی نمی‌شوند. (MIME: {mime_type})"
# فایل‌های باینری معروف که نباید خوانده شوند
binary_extensions = {
'exe', 'dll', 'so', 'dylib', 'bin', 'dat', 'db', 'sqlite',
'zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz',
'jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'svg', 'webp',
'mp3', 'mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm',
'wav', 'flac', 'aac', 'ogg', 'wma', 'm4a',
'pdf', 'doc', 'ppt', 'pptx', 'odt', 'ods', 'odp'
}
if file_extension in binary_extensions:
return f"فرمت فایل .{file_extension} یک فایل باینری است و پشتیبانی نمی‌شود"
# فایل‌های Excel
if file_extension in ['xlsx', 'xls', 'xlsm', 'xlsb']:
df = pd.read_excel(file_path)
return f"=== محتوای Excel ===\n{df.to_string()}"
# فایل‌های CSV و TSV
elif file_extension in ['csv', 'tsv']:
separator = '\t' if file_extension == 'tsv' else ','
df = pd.read_csv(file_path, sep=separator)
return f"=== محتوای {file_extension.upper()} ===\n{df.to_string()}"
# فایل‌های JSON
elif file_extension == 'json':
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return f"=== محتوای JSON ===\n{json.dumps(data, indent=2, ensure_ascii=False)}"
# فایل‌های YAML
elif file_extension in ['yaml', 'yml']:
with open(file_path, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
return f"=== محتوای YAML ===\n{yaml.dump(data, allow_unicode=True, default_flow_style=False)}"
# فایل‌های TOML
elif file_extension == 'toml':
with open(file_path, 'r', encoding='utf-8') as f:
data = toml.load(f)
return f"=== محتوای TOML ===\n{toml.dumps(data)}"
# فایل‌های INI/CFG
elif file_extension in ['ini', 'cfg', 'conf', 'config']:
config = configparser.ConfigParser()
config.read(file_path, encoding='utf-8')
output = f"=== محتوای {file_extension.upper()} ===\n"
for section in config.sections():
output += f"\n[{section}]\n"
for key, value in config.items(section):
output += f"{key} = {value}\n"
return output
# فایل‌های XML
elif file_extension == 'xml':
tree = ET.parse(file_path)
root = tree.getroot()
return f"=== محتوای XML ===\n{ET.tostring(root, encoding='unicode')}"
# سایر فایل‌ها - تلاش برای خواندن به عنوان متن
else:
# تشخیص encoding
with open(file_path, 'rb') as f:
raw_data = f.read(10000) # فقط 10KB اول برای تشخیص
result = chardet.detect(raw_data)
encoding = result['encoding'] if result['encoding'] else 'utf-8'
confidence = result['confidence'] if 'confidence' in result else 0
# اگر احتمال encoding کم باشد، احتمالا فایل باینری است
if confidence < 0.7:
try:
# تلاش با UTF-8
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return f"=== محتوای فایل (UTF-8) ===\n{content}"
except UnicodeDecodeError:
return "این فایل احتمالاً باینری است یا encoding آن قابل تشخیص نیست"
# خواندن با encoding تشخیص داده شده
try:
with open(file_path, 'r', encoding=encoding) as f:
content = f.read()
return f"=== محتوای فایل ({encoding}) ===\n{content}"
except:
# تلاش نهایی با encodings مختلف
for enc in ['utf-8', 'utf-16', 'latin-1', 'windows-1252', 'cp1256']:
try:
with open(file_path, 'r', encoding=enc) as f:
content = f.read()
return f"=== محتوای فایل ({enc}) ===\n{content}"
except:
continue
return "نمی‌توان این فایل را خواند. احتمالاً فایل باینری است."
except Exception as e:
return f"خطا در خواندن فایل: {str(e)}"
# لیست فرمت‌های پشتیبانی شده
supported_formats = """
**فرمت‌های پشتیبانی شده:**
- فایل‌های متنی: .txt, .log, .md, .rst, .tex
- کدهای برنامه‌نویسی: .py, .js, .ts, .java, .cpp, .c, .h, .cs, .rb, .go, .rs, .swift, .kt, .scala, .r, .m, .php, .pl, .lua, .sh, .bat, .ps1
- فایل‌های وب: .html, .htm, .css, .scss, .sass, .less, .jsx, .tsx, .vue
- فایل‌های پیکربندی: .json, .yaml, .yml, .toml, .ini, .cfg, .conf, .config, .env, .properties
- فایل‌های داده: .csv, .tsv, .xml
- فایل‌های Office: .xlsx, .xls (نیاز به محتوای متنی)
- و بسیاری فرمت‌های متنی دیگر...
**فرمت‌های پشتیبانی نشده:**
- تصاویر: .jpg, .png, .gif, .bmp, و...
- صوت: .mp3, .wav, .flac, و...
- ویدیو: .mp4, .avi, .mkv, و...
- فایل‌های فشرده: .zip, .rar, .tar, و...
- فایل‌های باینری: .exe, .dll, .bin, و...
"""
# رابط کاربری Gradio
iface = gr.Interface(
fn=read_file,
inputs=gr.File(label="فایل را انتخاب کنید", file_types=None),
outputs=gr.Textbox(label="محتوای فایل", lines=25, max_lines=100),
title="خواننده جامع فایل‌های متنی",
description="تقریباً هر فایل متنی را آپلود کنید تا محتوای آن را مشاهده کنید\n" + supported_formats,
examples=[],
theme="soft"
)
if __name__ == "__main__":
iface.launch()