Jongpal12 commited on
Commit
06b0d5c
·
verified ·
1 Parent(s): c80e94c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -0
app.py CHANGED
@@ -13,6 +13,96 @@ os.environ["STREAMLIT_HOME"] = str(STREAMLIT_DIR)
13
  os.environ["STREAMLIT_SERVER_HEADLESS"] = "true"
14
  os.environ["STREAMLIT_BROWSER_GATHER_USAGE_STATS"] = "false"
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  # ──────────────────────────────── CSV 안전 로더 ────────────────────────────────
17
  def read_csv_safe(path, encodings=("utf-8", "cp949")):
18
  last_err = None
 
13
  os.environ["STREAMLIT_SERVER_HEADLESS"] = "true"
14
  os.environ["STREAMLIT_BROWSER_GATHER_USAGE_STATS"] = "false"
15
 
16
+ from huggingface_hub import hf_hub_download
17
+
18
+ # (선택) 데이터셋 리포를 쓰고 싶으면 환경변수로 지정하세요.
19
+ # 예: HF_DATASET_REPO="yourname/moai-travel-data", HF_DATASET_REV="main"
20
+ HF_DATASET_REPO = os.getenv("HF_DATASET_REPO", None) # None이면 로컬 우선
21
+ HF_DATASET_REV = os.getenv("HF_DATASET_REV", "main")
22
+
23
+ def _is_pointer_bytes(b: bytes) -> bool:
24
+ head = b[:2048].decode(errors="ignore").lower()
25
+ return (
26
+ "version https://git-lfs.github.com/spec/v1" in head
27
+ or "git-lfs" in head
28
+ or "xet" in head
29
+ or "pointer size" in head
30
+ )
31
+
32
+ def _read_csv_bytes(b: bytes) -> pd.DataFrame:
33
+ # utf-8 → cp949 순으로 시도
34
+ try:
35
+ return pd.read_csv(io.BytesIO(b), encoding="utf-8")
36
+ except UnicodeDecodeError:
37
+ return pd.read_csv(io.BytesIO(b), encoding="cp949")
38
+
39
+ def load_csv_smart(local_path: str,
40
+ hub_filename: str | None = None,
41
+ repo_id: str | None = HF_DATASET_REPO,
42
+ repo_type: str = "dataset",
43
+ revision: str = HF_DATASET_REV) -> pd.DataFrame:
44
+ """
45
+ 1) 로컬 파일이 있으면 즉시 사용
46
+ 2) 없고 repo_id가 있으면 HF Hub에서 받아서 사용
47
+ 3) 둘 다 실패하면 Streamlit 에러
48
+ """
49
+ if hub_filename is None:
50
+ hub_filename = os.path.basename(local_path)
51
+
52
+ # 1) 로컬 우선
53
+ if os.path.exists(local_path):
54
+ with open(local_path, "rb") as f:
55
+ data = f.read()
56
+ if not _is_pointer_bytes(data):
57
+ return _read_csv_bytes(data)
58
+
59
+ # 2) 허브에서 받기 (repo_id가 설정된 경우)
60
+ if repo_id:
61
+ try:
62
+ cached = hf_hub_download(repo_id=repo_id, filename=hub_filename,
63
+ repo_type=repo_type, revision=revision)
64
+ # 파일 자체를 다시 읽어서 인코딩 안전처리
65
+ with open(cached, "rb") as f:
66
+ data = f.read()
67
+ return _read_csv_bytes(data)
68
+ except Exception as e:
69
+ st.error(f"Hub에서 {hub_filename} 받기 실패: {e}")
70
+
71
+ # 3) 최종 실패
72
+ st.error(f"데이터 파일을 찾을 수 없습니다: {local_path} (또는 Hub: {hub_filename})")
73
+ st.stop()
74
+
75
+ def load_json_smart(local_path: str,
76
+ hub_filename: str | None = None,
77
+ repo_id: str | None = HF_DATASET_REPO,
78
+ repo_type: str = "dataset",
79
+ revision: str = HF_DATASET_REV):
80
+ if hub_filename is None:
81
+ hub_filename = os.path.basename(local_path)
82
+
83
+ # 1) 로컬 우선
84
+ if os.path.exists(local_path):
85
+ with open(local_path, "rb") as f:
86
+ data = f.read()
87
+ if not _is_pointer_bytes(data):
88
+ try:
89
+ return json.loads(data.decode("utf-8"))
90
+ except Exception:
91
+ return json.loads(data.decode("cp949"))
92
+
93
+ # 2) 허브
94
+ if repo_id:
95
+ try:
96
+ cached = hf_hub_download(repo_id=repo_id, filename=hub_filename,
97
+ repo_type=repo_type, revision=revision)
98
+ with open(cached, "r", encoding="utf-8") as f:
99
+ return json.load(f)
100
+ except Exception as e:
101
+ st.error(f"Hub에서 {hub_filename} 받기 실패: {e}")
102
+
103
+ # 3) 최종 실패
104
+ st.error(f"JSON 파일을 찾을 수 없습니다: {local_path} (또는 Hub: {hub_filename})")
105
+ st.stop()
106
  # ──────────────────────────────── CSV 안전 로더 ────────────────────────────────
107
  def read_csv_safe(path, encodings=("utf-8", "cp949")):
108
  last_err = None