Heim  >  Artikel  >  Backend-Entwicklung  >  Geben Sie Tipps zur effizienten Verarbeitung von Datei-E/A-Vorgängen in Python

Geben Sie Tipps zur effizienten Verarbeitung von Datei-E/A-Vorgängen in Python

高洛峰
高洛峰Original
2017-03-16 16:16:251320Durchsuche

Wie lese und schreibe ich Textdateien?

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
'你好'

So legen Sie den Puffer der Datei fest

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()

So werden Dateien zugeordnet zur Erinnerung?

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 &#39;mmap.mmap&#39;>
# 可以通过索引获取内容
>>> 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

Wie greife ich auf den Status einer Datei zu?

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

Wie verwende ich temporäre Dateien?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn