Heim >Backend-Entwicklung >Python-Tutorial >Geben Sie Tipps zur effizienten Verarbeitung von Datei-E/A-Vorgängen in Python
Eigentlicher Fall
Ein bestimmtes Textdatei-Kodierungsformat wurde geändert (z. B. UTF-8, GBK, BIG5), wie es in Python2.x verwendet wird bzw. python3.x Diese Dateien lesen?
Lösung
Achten Sie auf den Unterschied zwischen Python2 und Python3
Die Semantik der Zeichenfolge hat sich geändert:
python2 | python3 |
str | bytes |
unicode | str |
python2.x kodiert Unicode vor dem Schreiben der Datei und dekodiert die Binärzeichenfolge nach dem Lesen der Datei
>>> f = open('py2.txt', 'w') >>> s = u'你好' >>> f.write(s.encode('gbk')) >>> f.close() >>> f = open('py2.txt', 'r') >>> t = f.read() >>> print t.decode('gbk')
Hallo
öffnet in python3.x Funktion gibt den Textmodus von t an, Encoding gibt das Codierungsformat an
>>> f = open('py3.txt', 'wt', encoding='utf-8') >>> f.write('你好') 2 >>> f.close() >>> f = open('py3.txt', 'rt', encoding='utf-8') >>> s = f.read() >>> s '你好'
Eigentlicher Fall
Schreiben Sie den Dateiinhalt in Bei der Verwendung eines Geräts werden Systemaufrufe verwendet, die lange dauern. Um die Anzahl der E/A-Vorgänge zu reduzieren, werden normalerweise Puffer verwendet (Systemaufrufe werden nur durchgeführt, wenn solche vorhanden sind). genügend Daten) und das Cache Verhalten der Datei, unterteilt in vollständige Pufferung, Zeilenpufferung und keine Pufferung.
Wie stelle ich den Pufferkontext des Datei--Objekts in Python ein?
Lösung
Vollständige Pufferung: Die Pufferung der offenen Funktion wird auf eine Ganzzahl n größer als 1 eingestellt, n ist die Puffergröße
>>> f = open('demo2.txt', 'w', buffering=2048) >>> f.write('+' * 1024) >>> f.write('+' * 1023) # 大于2048的时候就写入文件 >>> f.write('-' * 2) >>> f.close()
Zeilenpufferung: Die Pufferung der Öffnungsfunktion ist auf 1 gesetzt
>>> f = open('demo3.txt', 'w', buffering=1) >>> f.write('abcd') >>> f.write('1234') # 只要加上\n就写入文件中 >>> f.write('\n') >>> f.close()
Keine Pufferung: Die Pufferung der Öffnungsfunktion ist auf 0 gesetzt
>>> f = open('demo4.txt', 'w', buffering=0) >>> f.write('a') >>> f.write('b') >>> f.close()
Tatsächliche Fälle
Beim Zugriff auf bestimmte Binärdateien besteht die Hoffnung, dass die Dateien in den Speicher abgebildet werden können, um einen wahlfreien Zugriff zu erreichen (Framebuffer-Gerätedatei)
Einige Einbettungsgeräte , die Register sind an den Speicheradressraum adressiert, wir können einen bestimmten Bereich von /dev/mem zuordnen, um auf diese Register zuzugreifen
Wenn mehrere Prozesse derselben Datei zugeordnet sind, kann auch Prozesskommunikation erreicht werden
Lösung
Verwenden Sie die mmap()-Funktion des mmap-Moduls in der Standardbibliothek, die einen offenen Dateideskriptor als Parameter erfordert
Erstellen Sie die folgende Dateien
[root@pythontab.com ~]# dd if=/dev/zero of=demo.bin bs=1024 count=1024 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB) copied, 0.00380084 s, 276 MB/s # 以十六进制格式查看文件内容 [root@pythontab.com ~]# od -x demo.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
>>> import mmap >>> import os >>> f = open('demo.bin','r+b') # 获取文件描述符 >>> f.fileno() 3 >>> m = mmap.mmap(f.fileno(),0,access=mmap.ACCESS_WRITE) >>> type(m) <type 'mmap.mmap'> # 可以通过索引获取内容 >>> m[0] '\x00' >>> m[10:20] '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' # 修改内容 >>> m[0] = '\x88'
Ansicht
[root@pythontab.com ~]# od -x demo.bin 0000000 0088 0000 0000 0000 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
Slices ändern
>>> m[4:8] = '\xff' * 4
Ansicht
[root@pythontab.com ~]# od -x demo.bin 0000000 0088 0000 ffff ffff 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
>>> m = mmap.mmap(f.fileno(),mmap.PAGESIZE * 8,access=mmap.ACCESS_WRITE,offset=mmap.PAGESIZE * 4) >>> m[:0x1000] = '\xaa' * 0x1000
Ansicht
[root@pythontab.com ~]# od -x demo.bin 0000000 0088 0000 ffff ffff 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa * 0050000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
Eigentlicher Fall
In einigen Projekten müssen wir den Dateistatus abrufen, wie zum Beispiel:
Der Dateityp (normale Datei, Verzeichnis, symbolischer Link, Gerätedatei). ...)
Dateizugriffsrechte
Letzter Zugriff/Änderung/Knotenstatusänderungszeit der Datei
Allgemeine Dateigröße
…..
Lösung
Das aktuelle Verzeichnis enthält die folgenden Dateien
[root@pythontab.com 2017]# ll total 4 drwxr-xr-x 2 root root 4096 Sep 16 11:35 dirs -rw-r--r-- 1 root root 0 Sep 16 11:35 files lrwxrwxrwx 1 root root 37 Sep 16 11:36 lockfile -> /tmp/qtsingleapp-aegisG-46d2-lockfile
Systemaufruf
Drei Systeme unter dem OS-Modul im Standardbibliothek Rufen Sie stat, fstat, lstat auf, um den Dateistatus abzurufen
>>> import os >>> s = os.stat('files') >>> s posix.stat_result(st_mode=33188, st_ino=267646, st_dev=51713L, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1486197100, st_mtime=1486197100, st_ctime=1486197100) >>> s.st_mode 33188 >>> import stat # stat有很多S_IS..方法来判断文件的类型 >>> stat.S_ISDIR(s.st_mode) False # 普通文件 >>> stat.S_ISREG(s.st_mode) True
Rufen Sie die Zugriffsberechtigung der Datei ab, was wahr ist, solange sie größer als 0 ist
>>> s.st_mode & stat.S_IRUSR 256 >>> s.st_mode & stat.S_IXGRP 0 >>> s.st_mode & stat.S_IXOTH 0
Ermitteln Sie die Änderungszeit der Datei
# 访问时间 >>> s.st_atime 1486197100.3384446 # 修改时间 >>> s.st_mtime 1486197100.3384446 # 状态更新时间 >>> s.st_ctime 1486197100.3384446
Konvertieren Sie den erhaltenen Zeitstempel
>>> import time >>> time.localtime(s.st_atime) time.struct_time(tm_year=2016, tm_mon=9, tm_mday=16, tm_hour=11, tm_min=35, tm_sec=47, tm_wday=4, tm_yday=260, tm_isdst=0)
Ermitteln Sie die Größe der normalen Datei
>>> s.st_size 0
Verknüpfungsfunktion
Standardbibliothek Einige Funktionen unter os.path sind prägnanter zu verwenden
Dateityp beurteilen
>>> os.path.isdir('dirs') True >>> os.path.islink('lockfile') True >>> os.path.isfile('files') True
Datei dreimal ablegen
>>> os.path.getatime('files') 1486197100.3384445 >>> os.path.getmtime('files') 1486197100.3384445 >>> os.path.getctime('files') 1486197100.3384445
Dateigröße ermitteln
>>> os.path.getsize('files') 0
Eigentlicher Fall
In einem bestimmten Projekt sammeln wir Daten von Sensoren. Nach jeder Datenerfassung führen wir eine Datenanalyse durch und speichern die Analyseergebnisse letztendlich nur, wenn es sich um so große temporäre Daten handelt wird dauerhaft gespeichert. Der Speicher verbraucht viele Speicherressourcen. Wir können temporäre Dateien verwenden, um diese temporären Daten zu speichern (externer Speicher).
Temporäre Dateien müssen nicht benannt werden und werden nach dem Schließen automatisch gelöscht
Lösung
Verwenden Sie TemporaryFile, NamedTemporaryFile
>>> from tempfile import TemporaryFile, NamedTemporaryFile # 访问的时候只能通过对象f来进行访问 >>> f = TemporaryFile() >>> f.write('abcdef' * 100000) # 访问临时数据 >>> f.seek(0) >>> f.read(100) 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd' >>> ntf = NamedTemporaryFile() # 如果要让每次创建NamedTemporaryFile()对象时不删除文件,可以设置NamedTemporaryFile(delete=False) >>> ntf.name # 返回当前临时文件在文件系统中的路径 '/tmp/tmppNvNA6'unter tempfile in der Standardbibliothek
Das obige ist der detaillierte Inhalt vonGeben Sie Tipps zur effizienten Verarbeitung von Datei-E/A-Vorgängen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!