39
File-I/O ist doch ganz einfach, oder? Christian Kauhaus · [email protected] FLYING CIRCUS l e t y o u r w e b a p p f l y

File-I/O -- ist doch ganz einfach, oder?

Embed Size (px)

Citation preview

Page 1: File-I/O -- ist doch ganz einfach, oder?

File-I/Oist doch ganz einfach, oder?

Christian Kauhaus · [email protected]

FLYING CIRCUSlet your web app fly

Page 2: File-I/O -- ist doch ganz einfach, oder?

flyingcircus.io

Page 3: File-I/O -- ist doch ganz einfach, oder?

with open(’users.json’, ’w’) as f:json.dump(userdata, f)

Page 4: File-I/O -- ist doch ganz einfach, oder?
Page 5: File-I/O -- ist doch ganz einfach, oder?
Page 6: File-I/O -- ist doch ganz einfach, oder?

Abstraktion

Page 7: File-I/O -- ist doch ganz einfach, oder?

gut so

Page 8: File-I/O -- ist doch ganz einfach, oder?

(meistens)

Page 9: File-I/O -- ist doch ganz einfach, oder?
Page 10: File-I/O -- ist doch ganz einfach, oder?

Userspace

KernelspaceCodec

Universal newlineBuffer

Cache(s)Filesystem

Disk

open(filename, mode,

encoding=...,

newline=...,

buffering=...)

os.open(filename, flags,mode)

Page 11: File-I/O -- ist doch ganz einfach, oder?

Atomarität

Page 12: File-I/O -- ist doch ganz einfach, oder?

Illusion:I/O geschiehtin einem Stück

Page 13: File-I/O -- ist doch ganz einfach, oder?

with open(filename, ’wb’) as f:f.write(data)

open("out", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6write(6, "1628 0 0 1"..., 1572864) = 1572864write(6, "\232\210H\242\276v\n"..., 159416) = 159416close(6) = 0

Page 14: File-I/O -- ist doch ganz einfach, oder?

os.listdir(’/usr/lib’)

openat(AT_FDCWD, "/usr/lib", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3

getdents(3, /* 813 entries */, 32768) = 32728getdents(3, /* 809 entries */, 32768) = 32744getdents(3, /* 811 entries */, 32768) = 32720getdents(3, /* 657 entries */, 32768) = 26424getdents(3, /* 0 entries */, 32768) = 0close(3) = 0

Page 15: File-I/O -- ist doch ganz einfach, oder?

Problem?

Page 16: File-I/O -- ist doch ganz einfach, oder?

with open(filename, ’rb’) as f:data = f.read()

with open(filename, ’wb’) as f:f.write(process(data))

Page 17: File-I/O -- ist doch ganz einfach, oder?

with open(filename, ’rb’) as f:data = f.read()

with tempfile.NamedTemporaryFile(’wb’, dir=os.path.dirname(filename)) as t:

t.write(process(data))tempname = t.name

os.rename(tempname, filename)

Page 18: File-I/O -- ist doch ganz einfach, oder?
Page 19: File-I/O -- ist doch ganz einfach, oder?

Persistenz

Page 20: File-I/O -- ist doch ganz einfach, oder?

Illusion:I/O greift direktauf die Disk zu

Page 21: File-I/O -- ist doch ganz einfach, oder?

>>> f = open(’/tmp/out’, ’w’)>>> print(’hello world’, file=f)>>> os.system(’cat /tmp/out’)0>>> f.close()>>> os.system(’cat /tmp/out’)hello world0

Page 22: File-I/O -- ist doch ganz einfach, oder?

$ python write.py$ ls -l out-rw-r--r-- 1 ck users 5851 Okt 12 11:49 out

# system crash, reboot$ ls -l out-rw-r--r-- 1 ck users 0 Okt 12 11:49 out

Page 23: File-I/O -- ist doch ganz einfach, oder?

Buffer leerenCache leeren

Page 24: File-I/O -- ist doch ganz einfach, oder?

with open(filename, ’wb’) as f:f.write(data)f.flush()os.fsync(f)

Page 25: File-I/O -- ist doch ganz einfach, oder?
Page 26: File-I/O -- ist doch ganz einfach, oder?

Text-Dateien

Page 27: File-I/O -- ist doch ganz einfach, oder?

Illusion:DateienenthaltenUnicode-Codepoints

Page 28: File-I/O -- ist doch ganz einfach, oder?

>>> with open(filename) as f:... f.read()

UnicodeDecodeError: ’ascii’ codec can’t decode byte0xc3 in position 1: ordinal not in range(128)

Page 29: File-I/O -- ist doch ganz einfach, oder?

Implizite Codierung

Page 30: File-I/O -- ist doch ganz einfach, oder?

# enctest.py

print(’preferred encoding:’,locale.getpreferredencoding())

with open(’preferred’, ’w’) as f:f.write(’hëllo\n’)

print(’default encoding’,sys.getdefaultencoding())

with open(’default’, ’wb’) as f:f.write(’hëllo\n’.encode())

Page 31: File-I/O -- ist doch ganz einfach, oder?

$ export LC_ALL=de_DE # latin1 encoding$ python3.2 enctest.pypreferred encoding: ISO-8859-1default encoding utf-8

$ ls -l preferred default-rw-r--r-- 1 ck users 6 Okt 12 12:52 preferred-rw-r--r-- 1 ck users 7 Okt 12 12:52 default

Page 32: File-I/O -- ist doch ganz einfach, oder?

explizit

Page 33: File-I/O -- ist doch ganz einfach, oder?

with open(filename, ’w’, encoding=’utf-8’) as f:f.write(data)

Page 34: File-I/O -- ist doch ganz einfach, oder?

Fazit

Page 35: File-I/O -- ist doch ganz einfach, oder?

File-I/O ist einfach

Page 36: File-I/O -- ist doch ganz einfach, oder?

Grenzen derAbstraktion kennen

Page 37: File-I/O -- ist doch ganz einfach, oder?
Page 38: File-I/O -- ist doch ganz einfach, oder?

Fragen?

Page 39: File-I/O -- ist doch ganz einfach, oder?

Bildnachweis

© zweiwest.ch flickr.com/teachernzCC BY-NC-SA flickr.com/iaea_imagebankCC BY-NC-ND

flickr.com/atlanticaCC BY flickr.com/jasoneppinkCC BY-NC-SA flickr.com/seychelles88CC BY-NC-SA