Saltar al contenido principal

ํŒŒ์ผ ์ž๋™ํ™”

Python์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ ์ธ ํŒŒ์ผ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์ƒ์„ฑ, ์‚ญ์ œ, ์ด๋™, ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ์ฝ”๋“œ๋กœ ์ฒ˜๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ชจ๋“ˆโ€‹

os ๋ชจ๋“ˆโ€‹

์šด์˜์ฒด์ œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

import os

# ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ
current_dir = os.getcwd()
print(f"ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ: {current_dir}")

# ๋””๋ ‰ํ† ๋ฆฌ ๋ณ€๊ฒฝ
os.chdir('/Users/username/Documents')

# ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ๋ณด๊ธฐ
files = os.listdir('.')
print(files)

# ๊ฒฝ๋กœ ๊ฒฐํ•ฉ (์šด์˜์ฒด์ œ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ)
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path) # folder/subfolder/file.txt (macOS/Linux)

shutil ๋ชจ๋“ˆโ€‹

๊ณ ์ˆ˜์ค€ ํŒŒ์ผ ์ž‘์—…์„ ์œ„ํ•œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

import shutil

# ํŒŒ์ผ ๋ณต์‚ฌ
shutil.copy('source.txt', 'destination.txt')

# ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จ ๋ณต์‚ฌ
shutil.copy2('source.txt', 'destination.txt')

# ํด๋” ์ „์ฒด ๋ณต์‚ฌ
shutil.copytree('source_folder', 'destination_folder')

# ํŒŒ์ผ/ํด๋” ์ด๋™
shutil.move('old_location.txt', 'new_location.txt')

# ํด๋” ์‚ญ์ œ (๋‚ด์šฉ๋ฌผ ํฌํ•จ)
shutil.rmtree('folder_to_delete')

ํด๋” ๋ฐ ํŒŒ์ผ ์ƒ์„ฑโ€‹

๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑโ€‹

import os

# ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
if not os.path.exists('new_folder'):
os.mkdir('new_folder')

# ์ค‘์ฒฉ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
os.makedirs('parent/child/grandchild', exist_ok=True)
# exist_ok=True: ์ด๋ฏธ ์กด์žฌํ•ด๋„ ์—๋Ÿฌ ๋ฐœ์ƒ ์•ˆ ํ•จ

ํŒŒ์ผ ์ƒ์„ฑโ€‹

# ๋นˆ ํŒŒ์ผ ์ƒ์„ฑ
with open('new_file.txt', 'w') as f:
pass

# ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ ํŒŒ์ผ ์ƒ์„ฑ
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('Hello, World!\n')
f.write('Python ์ž๋™ํ™”')

ํŒŒ์ผ ๋ฐ ํด๋” ์‚ญ์ œโ€‹

import os
import shutil

# ํŒŒ์ผ ์‚ญ์ œ
if os.path.exists('file_to_delete.txt'):
os.remove('file_to_delete.txt')

# ๋นˆ ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ
if os.path.exists('empty_folder'):
os.rmdir('empty_folder')

# ๋‚ด์šฉ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ
if os.path.exists('folder_with_files'):
shutil.rmtree('folder_with_files')

ํŒŒ์ผ ๊ฒ€์ƒ‰โ€‹

os.walk๋กœ ํ•˜์œ„ ํด๋” ํƒ์ƒ‰โ€‹

import os

# ๋ชจ๋“  ํ•˜์œ„ ํด๋”์˜ ํŒŒ์ผ ์ฐพ๊ธฐ
for root, dirs, files in os.walk('/path/to/search'):
for file in files:
if file.endswith('.txt'):
full_path = os.path.join(root, file)
print(full_path)

glob ํŒจํ„ด ๋งค์นญโ€‹

import glob

# ํ˜„์žฌ ํด๋”์˜ ๋ชจ๋“  .py ํŒŒ์ผ
python_files = glob.glob('*.py')

# ๋ชจ๋“  ํ•˜์œ„ ํด๋”์˜ .txt ํŒŒ์ผ
all_txt_files = glob.glob('**/*.txt', recursive=True)

# ํŠน์ • ํŒจํ„ด์˜ ํŒŒ์ผ
data_files = glob.glob('data_*.csv')

# pathlib๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ
from pathlib import Path

for file in Path('.').rglob('*.log'):
print(file)

ํŒŒ์ผ ์ •๋ณด ํ™•์ธโ€‹

import os
from datetime import datetime

file_path = 'example.txt'

# ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
exists = os.path.exists(file_path)

# ํŒŒ์ผ์ธ์ง€ ๋””๋ ‰ํ† ๋ฆฌ์ธ์ง€ ํ™•์ธ
is_file = os.path.isfile(file_path)
is_dir = os.path.isdir(file_path)

# ํŒŒ์ผ ํฌ๊ธฐ (๋ฐ”์ดํŠธ)
size = os.path.getsize(file_path)
print(f"ํฌ๊ธฐ: {size / 1024:.2f} KB")

# ํŒŒ์ผ ์ˆ˜์ • ์‹œ๊ฐ„
mtime = os.path.getmtime(file_path)
modified_date = datetime.fromtimestamp(mtime)
print(f"๋งˆ์ง€๋ง‰ ์ˆ˜์ •: {modified_date}")

# ํŒŒ์ผ ์ƒ์„ฑ ์‹œ๊ฐ„
ctime = os.path.getctime(file_path)
created_date = datetime.fromtimestamp(ctime)
print(f"์ƒ์„ฑ ์‹œ๊ฐ„: {created_date}")

์‹ค์ „ ์˜ˆ์ œโ€‹

1. ์‚ฌ์ง„ ์ •๋ฆฌ ์Šคํฌ๋ฆฝํŠธโ€‹

๋‚ ์งœ๋ณ„๋กœ ์‚ฌ์ง„์„ ์ž๋™์œผ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

import os
import shutil
from datetime import datetime
from pathlib import Path

def organize_photos(source_dir, dest_dir):
"""์‚ฌ์ง„์„ ๋‚ ์งœ๋ณ„๋กœ ์ •๋ฆฌ"""

# ๋ชฉ์ ์ง€ ํด๋” ์ƒ์„ฑ
os.makedirs(dest_dir, exist_ok=True)

# ์ด๋ฏธ์ง€ ํ™•์žฅ์ž
image_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.heic'}

for file_path in Path(source_dir).rglob('*'):
if file_path.suffix.lower() in image_extensions:
# ํŒŒ์ผ ์ˆ˜์ • ๋‚ ์งœ ๊ฐ€์ ธ์˜ค๊ธฐ
mtime = os.path.getmtime(file_path)
date = datetime.fromtimestamp(mtime)

# ์—ฐ๋„/์›” ํด๋” ์ƒ์„ฑ
year_month = date.strftime('%Y/%m')
target_dir = os.path.join(dest_dir, year_month)
os.makedirs(target_dir, exist_ok=True)

# ํŒŒ์ผ ์ด๋™
target_path = os.path.join(target_dir, file_path.name)

# ์ค‘๋ณต ํŒŒ์ผ๋ช… ์ฒ˜๋ฆฌ
counter = 1
while os.path.exists(target_path):
name, ext = os.path.splitext(file_path.name)
target_path = os.path.join(
target_dir,
f"{name}_{counter}{ext}"
)
counter += 1

shutil.move(str(file_path), target_path)
print(f"์ด๋™: {file_path.name} -> {year_month}/")

# ์‚ฌ์šฉ ์˜ˆ์ œ
organize_photos('/Users/username/Downloads', '/Users/username/Photos')

2. ์ž๋™ ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธโ€‹

์ค‘์š”ํ•œ ํŒŒ์ผ์„ ๋‚ ์งœ๋ณ„๋กœ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค.

import os
import shutil
from datetime import datetime
import zipfile

def backup_files(source_dirs, backup_dir):
"""ํŒŒ์ผ์„ ์••์ถ•ํ•˜์—ฌ ๋ฐฑ์—…"""

# ๋ฐฑ์—… ํด๋” ์ƒ์„ฑ
os.makedirs(backup_dir, exist_ok=True)

# ๋ฐฑ์—… ํŒŒ์ผ๋ช… (๋‚ ์งœ ํฌํ•จ)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_name = f"backup_{timestamp}.zip"
backup_path = os.path.join(backup_dir, backup_name)

# ZIP ํŒŒ์ผ ์ƒ์„ฑ
with zipfile.ZipFile(backup_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for source_dir in source_dirs:
for root, dirs, files in os.walk(source_dir):
for file in files:
file_path = os.path.join(root, file)
# ZIP ๋‚ด ๊ฒฝ๋กœ ์„ค์ •
arcname = os.path.relpath(file_path, os.path.dirname(source_dir))
zipf.write(file_path, arcname)
print(f"๋ฐฑ์—…: {file_path}")

# ํŒŒ์ผ ํฌ๊ธฐ ํ™•์ธ
size_mb = os.path.getsize(backup_path) / (1024 * 1024)
print(f"\n๋ฐฑ์—… ์™„๋ฃŒ: {backup_name} ({size_mb:.2f} MB)")

# ์˜ค๋ž˜๋œ ๋ฐฑ์—… ์‚ญ์ œ (30๊ฐœ ์ด์ƒ ์œ ์ง€ ์•ˆ ํ•จ)
cleanup_old_backups(backup_dir, keep=30)

def cleanup_old_backups(backup_dir, keep=30):
"""์˜ค๋ž˜๋œ ๋ฐฑ์—… ํŒŒ์ผ ์‚ญ์ œ"""
backups = []

for file in os.listdir(backup_dir):
if file.startswith('backup_') and file.endswith('.zip'):
file_path = os.path.join(backup_dir, file)
mtime = os.path.getmtime(file_path)
backups.append((mtime, file_path))

# ์ตœ์‹  ์ˆœ์œผ๋กœ ์ •๋ ฌ
backups.sort(reverse=True)

# ์˜ค๋ž˜๋œ ๋ฐฑ์—… ์‚ญ์ œ
for _, file_path in backups[keep:]:
os.remove(file_path)
print(f"์‚ญ์ œ: {os.path.basename(file_path)}")

# ์‚ฌ์šฉ ์˜ˆ์ œ
backup_files(
source_dirs=[
'/Users/username/Documents',
'/Users/username/Projects'
],
backup_dir='/Users/username/Backups'
)

3. ๋กœ๊ทธ ํŒŒ์ผ ์ •๋ฆฌโ€‹

์˜ค๋ž˜๋˜๊ณ  ํฐ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

import os
import gzip
import shutil
from datetime import datetime, timedelta

def cleanup_logs(log_dir, days_to_keep=7, compress_days=3):
"""๋กœ๊ทธ ํŒŒ์ผ ์ •๋ฆฌ ๋ฐ ์••์ถ•"""

now = datetime.now()

for file in os.listdir(log_dir):
if not file.endswith('.log'):
continue

file_path = os.path.join(log_dir, file)

# ํŒŒ์ผ ์ˆ˜์ • ๋‚ ์งœ
mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
age = (now - mtime).days

# ์˜ค๋ž˜๋œ ํŒŒ์ผ ์‚ญ์ œ
if age > days_to_keep:
os.remove(file_path)
print(f"์‚ญ์ œ: {file} (์ƒ์„ฑ ํ›„ {age}์ผ)")

# ์ค‘๊ฐ„ ๋‚ ์งœ ํŒŒ์ผ ์••์ถ•
elif age > compress_days:
# ์ด๋ฏธ ์••์ถ•๋œ ํŒŒ์ผ์€ ์Šคํ‚ต
gz_path = file_path + '.gz'
if os.path.exists(gz_path):
continue

# ์••์ถ•
with open(file_path, 'rb') as f_in:
with gzip.open(gz_path, 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)

# ์›๋ณธ ์‚ญ์ œ
os.remove(file_path)

# ํฌ๊ธฐ ๋น„๊ต
original_size = os.path.getsize(file_path)
compressed_size = os.path.getsize(gz_path)
ratio = (1 - compressed_size / original_size) * 100

print(f"์••์ถ•: {file} (์šฉ๋Ÿ‰ {ratio:.1f}% ๊ฐ์†Œ)")

# ์‚ฌ์šฉ ์˜ˆ์ œ
cleanup_logs('/var/log/myapp', days_to_keep=7, compress_days=3)

4. ํŒŒ์ผ๋ช… ์ผ๊ด„ ๋ณ€๊ฒฝโ€‹

์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

import os
import re

def batch_rename(directory, pattern, replacement):
"""์ •๊ทœ์‹ ํŒจํ„ด์œผ๋กœ ํŒŒ์ผ๋ช… ์ผ๊ด„ ๋ณ€๊ฒฝ"""

renamed_count = 0

for filename in os.listdir(directory):
# ํŒจํ„ด ๋งค์นญ
new_name = re.sub(pattern, replacement, filename)

if new_name != filename:
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_name)

# ์ค‘๋ณต ๋ฐฉ์ง€
if os.path.exists(new_path):
print(f"๊ฑด๋„ˆ๋œ€: {filename} (์ด๋ฏธ ์กด์žฌํ•จ)")
continue

os.rename(old_path, new_path)
print(f"{filename} -> {new_name}")
renamed_count += 1

print(f"\n์ด {renamed_count}๊ฐœ ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ ์™„๋ฃŒ")

def add_prefix(directory, prefix):
"""๋ชจ๋“  ํŒŒ์ผ์— ์ ‘๋‘์‚ฌ ์ถ”๊ฐ€"""
for filename in os.listdir(directory):
old_path = os.path.join(directory, filename)

# ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์ œ์™ธ
if os.path.isdir(old_path):
continue

new_name = prefix + filename
new_path = os.path.join(directory, new_name)

os.rename(old_path, new_path)
print(f"{filename} -> {new_name}")

def sequential_numbering(directory, prefix='file', start=1):
"""ํŒŒ์ผ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฒˆํ˜ธ ๋ถ€์—ฌ"""
files = [f for f in os.listdir(directory)
if os.path.isfile(os.path.join(directory, f))]

# ํŒŒ์ผ ์ •๋ ฌ
files.sort()

for i, filename in enumerate(files, start=start):
# ํ™•์žฅ์ž ๋ถ„๋ฆฌ
_, ext = os.path.splitext(filename)

old_path = os.path.join(directory, filename)
new_name = f"{prefix}_{i:03d}{ext}"
new_path = os.path.join(directory, new_name)

os.rename(old_path, new_path)
print(f"{filename} -> {new_name}")

# ์‚ฌ์šฉ ์˜ˆ์ œ
# ๊ณต๋ฐฑ์„ ์–ธ๋”์Šค์ฝ”์–ด๋กœ ๋ณ€๊ฒฝ
batch_rename('/path/to/files', r'\s+', '_')

# ๋‚ ์งœ ํ˜•์‹ ๋ณ€๊ฒฝ (2023-01-01 -> 20230101)
batch_rename('/path/to/files', r'(\d{4})-(\d{2})-(\d{2})', r'\1\2\3')

# ์ ‘๋‘์‚ฌ ์ถ”๊ฐ€
add_prefix('/path/to/files', 'backup_')

# ์ˆœ์ฐจ ๋ฒˆํ˜ธ ๋ถ€์—ฌ
sequential_numbering('/path/to/photos', prefix='photo', start=1)

5. ์ค‘๋ณต ํŒŒ์ผ ์ฐพ๊ธฐโ€‹

ํ•ด์‹œ๊ฐ’์œผ๋กœ ์ค‘๋ณต ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

import os
import hashlib
from collections import defaultdict

def file_hash(file_path, chunk_size=8192):
"""ํŒŒ์ผ์˜ MD5 ํ•ด์‹œ ๊ณ„์‚ฐ"""
hasher = hashlib.md5()

with open(file_path, 'rb') as f:
while chunk := f.read(chunk_size):
hasher.update(chunk)

return hasher.hexdigest()

def find_duplicates(directory):
"""์ค‘๋ณต ํŒŒ์ผ ์ฐพ๊ธฐ"""

# ํ•ด์‹œ๊ฐ’์œผ๋กœ ํŒŒ์ผ ๊ทธ๋ฃนํ™”
hash_to_files = defaultdict(list)

print("ํŒŒ์ผ ์Šค์บ” ์ค‘...")

for root, dirs, files in os.walk(directory):
for filename in files:
file_path = os.path.join(root, filename)

try:
file_size = os.path.getsize(file_path)

# ๋นˆ ํŒŒ์ผ์€ ์ œ์™ธ
if file_size == 0:
continue

# ํ•ด์‹œ ๊ณ„์‚ฐ
file_hash_value = file_hash(file_path)
hash_to_files[file_hash_value].append((file_path, file_size))

except (OSError, PermissionError) as e:
print(f"์˜ค๋ฅ˜: {file_path} - {e}")

# ์ค‘๋ณต ํŒŒ์ผ ์ถœ๋ ฅ
print("\n์ค‘๋ณต ํŒŒ์ผ:")
total_duplicates = 0
total_wasted_space = 0

for file_hash, files in hash_to_files.items():
if len(files) > 1:
print(f"\n๊ทธ๋ฃน (ํ•ด์‹œ: {file_hash[:8]}...):")

for file_path, file_size in files:
size_mb = file_size / (1024 * 1024)
print(f" - {file_path} ({size_mb:.2f} MB)")

# ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ์ค‘๋ณต
total_duplicates += len(files) - 1
total_wasted_space += files[0][1] * (len(files) - 1)

if total_duplicates > 0:
wasted_mb = total_wasted_space / (1024 * 1024)
print(f"\n์ด {total_duplicates}๊ฐœ์˜ ์ค‘๋ณต ํŒŒ์ผ")
print(f"๋‚ญ๋น„๋˜๋Š” ๊ณต๊ฐ„: {wasted_mb:.2f} MB")
else:
print("\n์ค‘๋ณต ํŒŒ์ผ ์—†์Œ")

# ์‚ฌ์šฉ ์˜ˆ์ œ
find_duplicates('/Users/username/Documents')

pathlib ์‚ฌ์šฉํ•˜๊ธฐโ€‹

๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

from pathlib import Path

# ๊ฒฝ๋กœ ์ƒ์„ฑ
path = Path('/Users/username/Documents')

# ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
if path.exists():
print("์กด์žฌํ•จ")

# ๋””๋ ‰ํ† ๋ฆฌ์ธ์ง€ ํ™•์ธ
if path.is_dir():
print("๋””๋ ‰ํ† ๋ฆฌ์ž„")

# ํŒŒ์ผ ๋ชฉ๋ก
for file in path.iterdir():
print(file.name)

# glob ํŒจํ„ด
for txt_file in path.glob('*.txt'):
print(txt_file)

# ์žฌ๊ท€ ๊ฒ€์ƒ‰
for py_file in path.rglob('*.py'):
print(py_file)

# ๊ฒฝ๋กœ ๊ฒฐํ•ฉ
new_path = path / 'subfolder' / 'file.txt'

# ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ
text_file = Path('example.txt')
text_file.write_text('Hello, World!', encoding='utf-8')
content = text_file.read_text(encoding='utf-8')

# ํŒŒ์ผ ์ •๋ณด
print(f"ํฌ๊ธฐ: {text_file.stat().st_size} bytes")
print(f"ํ™•์žฅ์ž: {text_file.suffix}")
print(f"ํŒŒ์ผ๋ช…: {text_file.stem}")
print(f"๋ถ€๋ชจ ๋””๋ ‰ํ† ๋ฆฌ: {text_file.parent}")

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธโ€‹

Q1. os์™€ pathlib ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?โ€‹

A: ์ƒˆ ํ”„๋กœ์ ํŠธ์—๋Š” pathlib๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋” ์ง๊ด€์ ์ด๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๋ฉฐ, ์šด์˜์ฒด์ œ ๊ฐ„ ํ˜ธํ™˜์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

# pathlib ๋ฐฉ์‹ (๊ถŒ์žฅ)
from pathlib import Path
path = Path.home() / 'Documents' / 'file.txt'

# os ๋ฐฉ์‹
import os
path = os.path.join(os.path.expanduser('~'), 'Documents', 'file.txt')

Q2. ํŒŒ์ผ์„ ์‚ญ์ œํ•  ๋•Œ ํœด์ง€ํ†ต์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‚˜์š”?โ€‹

A: send2trash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

from send2trash import send2trash

# ํŒŒ์ผ์„ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ (์™„์ „ ์‚ญ์ œ ์•ˆ ๋จ)
send2trash('file_to_delete.txt')

Q3. ํฐ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ๋•Œ ์ง„ํ–‰๋ฅ ์„ ๋ณด๊ณ  ์‹ถ์–ด์š”.โ€‹

A: tqdm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from tqdm import tqdm
import shutil

def copy_with_progress(src, dst):
total_size = os.path.getsize(src)

with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
with tqdm(total=total_size, unit='B', unit_scale=True) as pbar:
while chunk := fsrc.read(8192):
fdst.write(chunk)
pbar.update(len(chunk))

copy_with_progress('large_file.dat', 'destination.dat')

Q4. ํŒŒ์ผ ์ž‘์—… ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?โ€‹

A: try-except๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import os

try:
os.remove('file.txt')
except FileNotFoundError:
print("ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.")
except PermissionError:
print("ํŒŒ์ผ ์‚ญ์ œ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.")
except Exception as e:
print(f"์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜: {e}")

Q5. ํŒŒ์ผ ์ž‘์—…์ด ์•ˆ์ „ํ•œ๊ฐ€์š”? ์‹ค์ˆ˜๋กœ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‚˜์š”?โ€‹

A: ๋„ค, ์กฐ์‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์•ˆ์ „ ์ˆ˜์น™์„ ๋”ฐ๋ฅด์„ธ์š”:

import os

def safe_delete(file_path):
"""์•ˆ์ „ํ•œ ํŒŒ์ผ ์‚ญ์ œ"""

# 1. ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
if not os.path.exists(file_path):
print(f"ํŒŒ์ผ์ด ์—†์Œ: {file_path}")
return False

# 2. ์‚ฌ์šฉ์ž ํ™•์ธ
response = input(f"์ •๋ง ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? {file_path} (y/n): ")
if response.lower() != 'y':
print("์ทจ์†Œ๋จ")
return False

# 3. ๋ฐฑ์—… (์„ ํƒ์‚ฌํ•ญ)
backup_path = file_path + '.backup'
shutil.copy2(file_path, backup_path)

# 4. ์‚ญ์ œ
try:
os.remove(file_path)
print(f"์‚ญ์ œ ์™„๋ฃŒ: {file_path}")
print(f"๋ฐฑ์—… ์œ„์น˜: {backup_path}")
return True
except Exception as e:
print(f"์‚ญ์ œ ์‹คํŒจ: {e}")
return False

๋‹ค์Œ ๋‹จ๊ณ„โ€‹

ํŒŒ์ผ ์ž๋™ํ™”๋ฅผ ๋ฐฐ์› ๋‹ค๋ฉด, ๋‹ค์Œ ์ฃผ์ œ๋กœ ๋„˜์–ด๊ฐ€์„ธ์š”:

  • ์—‘์…€ ์ž๋™ํ™”: openpyxl๋กœ ์—‘์…€ ์ž‘์—… ์ž๋™ํ™”ํ•˜๊ธฐ
  • ์›น ์ž๋™ํ™”: Selenium์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์ œ์–ดํ•˜๊ธฐ
  • ์ž‘์—… ์Šค์ผ€์ค„๋ง: ์ •๊ธฐ์ ์ธ ์ž‘์—… ์ž๋™ ์‹คํ–‰ํ•˜๊ธฐ

ํŒŒ์ผ ์ž‘์—… ์ž๋™ํ™”๋Š” ์ผ์ƒ์ ์ธ ์—…๋ฌด๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์—…๋ฌด์— ์ ์šฉํ•ด๋ณด์„ธ์š”!