Skip to main content

ํŒŒ์ผ ์ž…์ถœ๋ ฅ

In Python, ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” how to, let's learn. ํŒŒ์ผ ์ž…์ถœ๋ ฅ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฐ€์žฅ Basic์ ์ธ ์ž‘์—….

Basic ํŒŒ์ผ ์—ด๊ธฐโ€‹

open() functionโ€‹

# ํŒŒ์ผ ์—ด๊ธฐ
file = open('example.txt', 'r')
content = file.read()
file.close() # ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•จ

print(content)

File Modesโ€‹

๋ชจ๋“œ์„ค๋ช…
'r'์ฝ๊ธฐ ๋ชจ๋“œ (Basic๊ฐ’)
'w'์“ฐ๊ธฐ ๋ชจ๋“œ (ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ๋ฎ์–ด์”€)
'a'์ถ”๊ฐ€ ๋ชจ๋“œ (ํŒŒ์ผ ๋์— ๋‚ด์šฉ ์ถ”๊ฐ€)
'x'์ƒ์„ฑ ๋ชจ๋“œ (ํŒŒ์ผ์ด ์—†์„ ๋•Œ๋งŒ ์ƒ์„ฑ)
'b'๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ (์˜ˆ: 'rb', 'wb')
't'ํ…์ŠคํŠธ ๋ชจ๋“œ (Basic๊ฐ’)
'+'์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋“œ (์˜ˆ: 'r+', 'w+')

with ๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿ“‹โ€‹

ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋‹ซ์•„์ฃผ๋Š” ์•ˆ์ „ํ•œ how to.

# ๊ถŒ์žฅํ•˜๋Š” how to
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
# with ๋ธ”๋ก์„ ๋ฒ—์–ด๋‚˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒ์ผ์ด ๋‹ซํž˜

Reading Filesโ€‹

Read Entire Fileโ€‹

# ์ „์ฒด ๋‚ด์šฉ์„ ๋ฌธ์ž์—ด๋กœ ์ฝ๊ธฐ
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)

Read Line by Lineโ€‹

# readline() - Read Line by Line
with open('data.txt', 'r', encoding='utf-8') as f:
line1 = f.readline() # ์ฒซ ๋ฒˆ์งธ ์ค„
line2 = f.readline() # ๋‘ ๋ฒˆ์งธ ์ค„
print(line1)
print(line2)

Read All Lines as Listโ€‹

# readlines() - ๋ชจ๋“  ์ค„์„ ๋ฆฌ์ŠคํŠธ๋กœ
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
print(line.strip()) # ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž ์ œ๊ฑฐ

Read with Loop (memory efficient)โ€‹

# ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ฐ˜๋ณต (ํฐ ํŒŒ์ผ์— ์œ ์šฉ)
with open('large_file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())

Writing Filesโ€‹

Write New (overwrite)โ€‹

# ํŒŒ์ผ์— ์“ฐ๊ธฐ
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('์ฒซ ๋ฒˆ์งธ ์ค„\n')
f.write('๋‘ ๋ฒˆ์งธ ์ค„\n')

Write Multiple Linesโ€‹

# writelines() ์‚ฌ์šฉ
lines = ['์‚ฌ๊ณผ\n', '๋ฐ”๋‚˜๋‚˜\n', '์˜ค๋ Œ์ง€\n']

with open('fruits.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)

Append to End of Fileโ€‹

# 'a' ๋ชจ๋“œ๋กœ ๋‚ด์šฉ ์ถ”๊ฐ€
with open('log.txt', 'a', encoding='utf-8') as f:
f.write('์ƒˆ๋กœ์šด ๋กœ๊ทธ ํ•ญ๋ชฉ\n')

Working with Binary Filesโ€‹

Copy Image Fileโ€‹

# ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ
with open('original.jpg', 'rb') as source:
with open('copy.jpg', 'wb') as target:
target.write(source.read())

Read in Bytesโ€‹

# ์ผ์ • ํฌ๊ธฐ์”ฉ ์ฝ๊ธฐ (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ)
with open('large_file.bin', 'rb') as f:
chunk_size = 1024 # 1KB
while True:
chunk = f.read(chunk_size)
if not chunk:
break
# chunk ์ฒ˜๋ฆฌ
print(f'์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜: {len(chunk)}')

Working with Paths (pathlib) ๐Ÿ›ค๏ธโ€‹

pathlib์€ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

from pathlib import Path

# ๊ฒฝ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
path = Path('documents/report.txt')

# ๊ฒฝ๋กœ ์ •๋ณด
print(path.name) # 'report.txt'
print(path.stem) # 'report'
print(path.suffix) # '.txt'
print(path.parent) # 'documents'

# ์ ˆ๋Œ€ ๊ฒฝ๋กœ
print(path.absolute())

# ๊ฒฝ๋กœ ์กด์žฌ ์—ฌ๋ถ€
if path.exists():
print('ํŒŒ์ผ์ด ์กด์žฌ')

# ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ
if path.is_file():
print('ํŒŒ์ผ')
if path.is_dir():
print('๋””๋ ‰ํ† ๋ฆฌ')

pathlib์œผ๋กœ Reading Files/์“ฐ๊ธฐโ€‹

from pathlib import Path

# Reading Files
path = Path('data.txt')
content = path.read_text(encoding='utf-8')

# Writing Files
path.write_text('์ƒˆ๋กœ์šด ๋‚ด์šฉ', encoding='utf-8')

# ๋ฐ”์ด๋„ˆ๋ฆฌ
data = path.read_bytes()
path.write_bytes(b'binary data')

๋””๋ ‰ํ† ๋ฆฌ ๋‹ค๋ฃจ๊ธฐโ€‹

from pathlib import Path

# ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
Path('new_folder').mkdir(exist_ok=True)

# ์ค‘์ฒฉ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
Path('parent/child/grandchild').mkdir(parents=True, exist_ok=True)

# ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ํŒŒ์ผ ๋ชฉ๋ก
for file in Path('.').glob('*.txt'):
print(file)

# ์žฌ๊ท€์ ์œผ๋กœ ๋ชจ๋“  ํŒŒ์ผ ์ฐพ๊ธฐ
for file in Path('.').rglob('*.py'):
print(file)

์‹ค์ „ Example ๐Ÿ’กโ€‹

Example 1: Log File Parserโ€‹

from datetime import datetime
from pathlib import Path

def parse_log_file(log_path):
"""๋กœ๊ทธ ํŒŒ์ผ์—์„œ ์—๋Ÿฌ๋งŒ ์ถ”์ถœ"""
errors = []

with open(log_path, 'r', encoding='utf-8') as f:
for line in f:
if 'ERROR' in line:
errors.append(line.strip())

return errors

# ์‚ฌ์šฉ Example
log_file = Path('app.log')
if log_file.exists():
errors = parse_log_file(log_file)

# ์—๋Ÿฌ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์ €์žฅ
error_file = Path('errors.txt')
error_file.write_text('\n'.join(errors), encoding='utf-8')

print(f'์ด {len(errors)}๊ฐœ์˜ ์—๋Ÿฌ ๋ฐœ๊ฒฌ')

Example 2: File Backupโ€‹

from pathlib import Path
from datetime import datetime
import shutil

def backup_file(file_path):
"""ํŒŒ์ผ์„ ๋ฐฑ์—… (ํƒ€์ž„์Šคํƒฌํ”„ ํฌํ•จ)"""
path = Path(file_path)

if not path.exists():
print(f'ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: {file_path}')
return None

# ๋ฐฑ์—… ํŒŒ์ผ๋ช… ์ƒ์„ฑ
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_name = f'{path.stem}_{timestamp}{path.suffix}'
backup_path = path.parent / 'backups' / backup_name

# ๋ฐฑ์—… ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
backup_path.parent.mkdir(exist_ok=True)

# ํŒŒ์ผ ๋ณต์‚ฌ
shutil.copy2(path, backup_path)
print(f'๋ฐฑ์—… ์™„๋ฃŒ: {backup_path}')

return backup_path

# ์‚ฌ์šฉ Example
backup_file('important_data.txt')

Example 3: CSV ํŒŒ์ผ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐโ€‹

from pathlib import Path

def process_csv_simple(csv_path):
"""๊ฐ„๋‹จํ•œ CSV ํŒŒ์ผ ์ฒ˜๋ฆฌ"""
with open(csv_path, 'r', encoding='utf-8') as f:
# ํ—ค๋” ์ฝ๊ธฐ
header = f.readline().strip().split(',')
print(f'์ปฌ๋Ÿผ: {header}')

# ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
for line in f:
values = line.strip().split(',')
data = dict(zip(header, values))
print(data)

# ์‚ฌ์šฉ Example
# process_csv_simple('users.csv')

Example 4: Processing Large Filesโ€‹

def process_large_file(file_path, chunk_size=8192):
"""๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์„ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ"""
total_bytes = 0

with open(file_path, 'rb') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break

total_bytes += len(chunk)
# ์ฒญํฌ ์ฒ˜๋ฆฌ ๋กœ์ง

return total_bytes

# ์‚ฌ์šฉ Example
# size = process_large_file('large_data.bin')
# print(f'์ฒ˜๋ฆฌํ•œ ํฌ๊ธฐ: {size / (1024**2):.2f} MB')

Example 5: ์„ค์ • Reading Files/์“ฐ๊ธฐโ€‹

from pathlib import Path

class ConfigManager:
"""๊ฐ„๋‹จํ•œ ์„ค์ • ํŒŒ์ผ ๊ด€๋ฆฌ์ž"""

def __init__(self, config_path='config.txt'):
self.path = Path(config_path)
self.config = {}
self.load()

def load(self):
"""์„ค์ • ํŒŒ์ผ ๋กœ๋“œ"""
if not self.path.exists():
return

with open(self.path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
key, value = line.split('=', 1)
self.config[key.strip()] = value.strip()

def save(self):
"""์„ค์ • ํŒŒ์ผ ์ €์žฅ"""
with open(self.path, 'w', encoding='utf-8') as f:
for key, value in self.config.items():
f.write(f'{key}={value}\n')

def get(self, key, default=None):
"""์„ค์ • ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ"""
return self.config.get(key, default)

def set(self, key, value):
"""์„ค์ • ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ"""
self.config[key] = value

# ์‚ฌ์šฉ Example
config = ConfigManager()
config.set('app_name', 'MyApp')
config.set('version', '1.0.0')
config.save()

print(config.get('app_name')) # 'MyApp'

Example 6: Analyzing File Informationโ€‹

from pathlib import Path
import os

def analyze_directory(dir_path):
"""๋””๋ ‰ํ† ๋ฆฌ ๋ถ„์„ ๋ฆฌํฌํŠธ"""
path = Path(dir_path)

if not path.is_dir():
print('๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค')
return

total_files = 0
total_size = 0
file_types = {}

for file in path.rglob('*'):
if file.is_file():
total_files += 1
size = file.stat().st_size
total_size += size

# ํ™•์žฅ์ž๋ณ„ ์ง‘๊ณ„
ext = file.suffix or 'no extension'
if ext not in file_types:
file_types[ext] = {'count': 0, 'size': 0}
file_types[ext]['count'] += 1
file_types[ext]['size'] += size

# ๋ฆฌํฌํŠธ ์ถœ๋ ฅ
print(f'์ด ํŒŒ์ผ ์ˆ˜: {total_files}')
print(f'์ด ํฌ๊ธฐ: {total_size / (1024**2):.2f} MB')
print('\nํŒŒ์ผ ํƒ€์ž…๋ณ„ ํ†ต๊ณ„:')
for ext, info in sorted(file_types.items()):
print(f' {ext}: {info["count"]}๊ฐœ, {info["size"] / 1024:.2f} KB')

# ์‚ฌ์šฉ Example
# analyze_directory('.')

Finding File Position (cursor)โ€‹

with open('data.txt', 'r') as f:
print(f.tell()) # ํ˜„์žฌ ์œ„์น˜: 0

f.read(10) # 10๋ฐ”์ดํŠธ ์ฝ๊ธฐ
print(f.tell()) # ํ˜„์žฌ ์œ„์น˜: 10

f.seek(0) # ์ฒ˜์Œ์œผ๋กœ ์ด๋™
print(f.tell()) # ํ˜„์žฌ ์œ„์น˜: 0

File Encoding ๐Ÿ’ญโ€‹

# UTF-8 ์ธ์ฝ”๋”ฉ (๊ถŒ์žฅ)
with open('ํ•œ๊ธ€.txt', 'w', encoding='utf-8') as f:
f.write('์•ˆ๋…•ํ•˜์„ธ์š”')

# ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ฝ๊ธฐ
encodings = ['utf-8', 'cp949', 'euc-kr']
for enc in encodings:
try:
with open('ํ•œ๊ธ€.txt', 'r', encoding=enc) as f:
content = f.read()
print(f'{enc}: ์„ฑ๊ณต')
break
except UnicodeDecodeError:
print(f'{enc}: ์‹คํŒจ')

Frequently Asked Questions โ“โ€‹

Q1: ํŒŒ์ผ์ด ์—ด๋ ค ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” how to์€?โ€‹

file = open('test.txt', 'r')
print(file.closed) # False

file.close()
print(file.closed) # True

Q2: ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” how to์€?โ€‹

from pathlib import Path
import os

# how to 1: pathlib
if Path('file.txt').exists():
print('ํŒŒ์ผ์ด ์กด์žฌ')

# how to 2: os module
if os.path.exists('file.txt'):
print('ํŒŒ์ผ์ด ์กด์žฌ')

Q3: ์ž„์‹œ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” how to์€?โ€‹

import tempfile

# ์ž„์‹œ ํŒŒ์ผ ์ƒ์„ฑ
with tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as f:
f.write('์ž„์‹œ ๋ฐ์ดํ„ฐ')
temp_path = f.name
print(f'์ž„์‹œ ํŒŒ์ผ: {temp_path}')

# ์‚ฌ์šฉ ํ›„ ์‚ญ์ œ
Path(temp_path).unlink()

Q4: ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฎ์–ด์“ฐ๋Š” how to์€?โ€‹

from pathlib import Path
import shutil

def safe_write(file_path, content):
"""๋ฐฑ์—… ํ›„ Writing Files"""
path = Path(file_path)

# ๊ธฐ์กด File Backup
if path.exists():
backup = path.with_suffix(path.suffix + '.bak')
shutil.copy2(path, backup)

try:
# ์ƒˆ ๋‚ด์šฉ ์“ฐ๊ธฐ
path.write_text(content, encoding='utf-8')
except Exception as e:
# ์‹คํŒจ ์‹œ ๋ฐฑ์—… ๋ณต์›
if backup.exists():
shutil.copy2(backup, path)
raise e

Q5: ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜๋Š” how to์€?โ€‹

from pathlib import Path

path = Path('file.txt')

# how to 1: stat()
size = path.stat().st_size
print(f'ํฌ๊ธฐ: {size} bytes')

# how to 2: os module
import os
size = os.path.getsize('file.txt')
print(f'ํฌ๊ธฐ: {size} bytes')

Precautions โš ๏ธโ€‹

  1. ํ•ญ์ƒ ์ธ์ฝ”๋”ฉ ์ง€์ •: encoding='utf-8'์„ ๋ช…์‹œํ•˜์„ธ์š”
  2. with ๋ฌธ ์‚ฌ์šฉ: ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋„๋ก ๋ณด์žฅ
  3. ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ: ํ•œ ๋ฒˆ์— ์ฝ์ง€ ๋ง๊ณ  ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ
  4. ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž: / ์‚ฌ์šฉ ๋˜๋Š” pathlib ์‚ฌ์šฉ (Windows ํ˜ธํ™˜์„ฑ)
  5. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ํŒŒ์ผ์ด ์—†๊ฑฐ๋‚˜ ๊ถŒํ•œ์ด ์—†์„ ์ˆ˜ ์žˆ์Œ

Performance Tips ๐Ÿš€โ€‹

# ์ข‹์Œ: ํŒŒ์ผ ๊ฐ์ฒด ์ง์ ‘ ๋ฐ˜๋ณต (memory efficient)
with open('large.txt', 'r') as f:
for line in f:
process(line)

# ๋‚˜์จ: ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
with open('large.txt', 'r') as f:
for line in f.readlines(): # ๋ชจ๋“  ์ค„์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
process(line)

Next Stepsโ€‹

  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ํŒŒ์ผ ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” how to
  • JSON๊ณผ CSV: ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ํ˜•์‹ ๋‹ค๋ฃจ๊ธฐ
  • os์™€ shutil module: ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ณ ๊ธ‰ ์ž‘์—… ๋ฐฐ์šฐ๊ธฐ