File-I/O

ist doch ganz einfach, oder?

Christian Kauhaus · kc@gocept.com

FLYING CIRCUS
let

y
yo u r w e b ap p f l
flyingcircus.io
with open(’users.json’, ’w’) as f:
json.dump(userdata, f)
Abstraktion
gut so
(meistens)
Kernelspace

Userspace

open(filename, mode,

Codec

encoding=...,

Universal newline

newline=...,

Buffer

Cache(s)
Files...
Atomarität
Illusion:
I/O geschieht
in einem Stück
with open(filename, ’wb’) as f:
f.write(data)

open("out", O_WRONLY|O_CREAT|O_TRUNC, 0666)
write(6, "1628 0
0
1"..., 15728...
os.listdir(’/usr/lib’)

openat(AT_FDCWD, "/usr/lib", O_RDONLY|O_NONBLOCK|
O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 813 en...
Problem?
with open(filename, ’rb’) as f:
data = f.read()
with open(filename, ’wb’) as f:
f.write(process(data))
with open(filename, ’rb’) as f:
data = f.read()
with tempfile.NamedTemporaryFile(
’wb’, dir=os.path.dirname(filename)) as ...
Persistenz
Illusion:
I/O greift direkt
auf die Disk zu
>>> f = open(’/tmp/out’, ’w’)
>>> print(’hello world’, file=f)
>>> os.system(’cat /tmp/out’)
0
>>> f.close()
>>> os.system...
$ 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 ...
Buffer leeren
Cache leeren
with open(filename, ’wb’) as f:
f.write(data)
f.flush()
os.fsync(f)
Text-Dateien
Illusion:
Dateien
enthalten
UnicodeCodepoints
>>> with open(filename) as f:
...
f.read()
UnicodeDecodeError: ’ascii’ codec can’t decode byte
0xc3 in position 1: ordinal...
Implizite Codierung
# enctest.py
print(’preferred encoding:’,
locale.getpreferredencoding())
with open(’preferred’, ’w’) as f:
f.write(’hëllon...
$ export LC_ALL=de_DE # latin1 encoding
$ python3.2 enctest.py
preferred encoding: ISO-8859-1
default encoding utf-8
$ ls ...
explizit
with open(filename, ’w’, encoding=’utf-8’) as f:
f.write(data)
Fazit
File-I/O ist einfach
Grenzen der
Abstraktion kennen
Fragen?
Bildnachweis

© zweiwest.ch

flickr.com/teachernz
CC BY-NC-SA

flickr.com/iaea_imagebank
CC BY-NC-ND

flickr.com/atlantica
CC...
File-I/O -- ist doch ganz einfach, oder?
File-I/O -- ist doch ganz einfach, oder?
File-I/O -- ist doch ganz einfach, oder?
File-I/O -- ist doch ganz einfach, oder?
File-I/O -- ist doch ganz einfach, oder?
File-I/O -- ist doch ganz einfach, oder?
Upcoming SlideShare
Loading in …5
×

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

449 views

Published on

File-I/O mit Python ist einfach. Meistens.

Der Vortrag soll Bewusstsein dafür schaffen, wann man sich aus einer komfortablen Umgebung (z.B. einem Application-Framework) in eine systemspezifische Domäne begibt. Aus meiner Erfahrung im DevOps-Umfeld sind mir viele Fälle bekannt, in denen Code auf Entwickler-Maschinen keine Probleme macht, sich aber auf produktiven Servern nicht ausreichend robust verhält. Die Eigenschaften von File-I/O in Python dienen dabei als durchgehendes Anwendungsbeispiel.

https://2013.de.pycon.org/schedule/sessions/17/

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
449
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. File-I/O ist doch ganz einfach, oder? Christian Kauhaus · kc@gocept.com FLYING CIRCUS let y yo u r w e b ap p f l
  2. 2. flyingcircus.io
  3. 3. with open(’users.json’, ’w’) as f: json.dump(userdata, f)
  4. 4. Abstraktion
  5. 5. gut so
  6. 6. (meistens)
  7. 7. Kernelspace Userspace open(filename, mode, Codec encoding=..., Universal newline newline=..., Buffer Cache(s) Filesystem Disk buffering=...) os.open(filename, flags, mode)
  8. 8. Atomarität
  9. 9. Illusion: I/O geschieht in einem Stück
  10. 10. with open(filename, ’wb’) as f: f.write(data) open("out", O_WRONLY|O_CREAT|O_TRUNC, 0666) write(6, "1628 0 0 1"..., 1572864) write(6, "232210H242276vn"..., 159416) close(6) = = = = 6 1572864 159416 0
  11. 11. os.listdir(’/usr/lib’) openat(AT_FDCWD, "/usr/lib", O_RDONLY|O_NONBLOCK| O_DIRECTORY|O_CLOEXEC) = 3 getdents(3, /* 813 entries */, 32768) = 32728 getdents(3, /* 809 entries */, 32768) = 32744 getdents(3, /* 811 entries */, 32768) = 32720 getdents(3, /* 657 entries */, 32768) = 26424 getdents(3, /* 0 entries */, 32768) = 0 close(3) = 0
  12. 12. Problem?
  13. 13. with open(filename, ’rb’) as f: data = f.read() with open(filename, ’wb’) as f: f.write(process(data))
  14. 14. 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)
  15. 15. Persistenz
  16. 16. Illusion: I/O greift direkt auf die Disk zu
  17. 17. >>> f = open(’/tmp/out’, ’w’) >>> print(’hello world’, file=f) >>> os.system(’cat /tmp/out’) 0 >>> f.close() >>> os.system(’cat /tmp/out’) hello world 0
  18. 18. $ 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
  19. 19. Buffer leeren Cache leeren
  20. 20. with open(filename, ’wb’) as f: f.write(data) f.flush() os.fsync(f)
  21. 21. Text-Dateien
  22. 22. Illusion: Dateien enthalten UnicodeCodepoints
  23. 23. >>> with open(filename) as f: ... f.read() UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc3 in position 1: ordinal not in range(128)
  24. 24. Implizite Codierung
  25. 25. # enctest.py print(’preferred encoding:’, locale.getpreferredencoding()) with open(’preferred’, ’w’) as f: f.write(’hëllon’) print(’default encoding’, sys.getdefaultencoding()) with open(’default’, ’wb’) as f: f.write(’hëllon’.encode())
  26. 26. $ export LC_ALL=de_DE # latin1 encoding $ python3.2 enctest.py preferred encoding: ISO-8859-1 default 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
  27. 27. explizit
  28. 28. with open(filename, ’w’, encoding=’utf-8’) as f: f.write(data)
  29. 29. Fazit
  30. 30. File-I/O ist einfach
  31. 31. Grenzen der Abstraktion kennen
  32. 32. Fragen?
  33. 33. Bildnachweis © zweiwest.ch flickr.com/teachernz CC BY-NC-SA flickr.com/iaea_imagebank CC BY-NC-ND flickr.com/atlantica CC BY flickr.com/jasoneppink CC BY-NC-SA flickr.com/seychelles88 CC BY-NC-SA

×