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

  • 162 views
Uploaded on

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

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/

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
162
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
1
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. flyingcircus.io
  • 3. with open(’users.json’, ’w’) as f: json.dump(userdata, f)
  • 4. Abstraktion
  • 5. gut so
  • 6. (meistens)
  • 7. Kernelspace Userspace open(filename, mode, Codec encoding=..., Universal newline newline=..., Buffer Cache(s) Filesystem Disk buffering=...) os.open(filename, flags, mode)
  • 8. Atomarität
  • 9. Illusion: I/O geschieht in einem Stück
  • 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. 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. Problem?
  • 13. with open(filename, ’rb’) as f: data = f.read() with open(filename, ’wb’) as f: f.write(process(data))
  • 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. Persistenz
  • 16. Illusion: I/O greift direkt auf die Disk zu
  • 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. $ 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. Buffer leeren Cache leeren
  • 20. with open(filename, ’wb’) as f: f.write(data) f.flush() os.fsync(f)
  • 21. Text-Dateien
  • 22. Illusion: Dateien enthalten UnicodeCodepoints
  • 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. Implizite Codierung
  • 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. $ 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. explizit
  • 28. with open(filename, ’w’, encoding=’utf-8’) as f: f.write(data)
  • 29. Fazit
  • 30. File-I/O ist einfach
  • 31. Grenzen der Abstraktion kennen
  • 32. Fragen?
  • 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