> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 효율적인 파일 I/O 작업 처리를 사용하는 방법에 대한 팁 공유

Python에서 효율적인 파일 I/O 작업 처리를 사용하는 방법에 대한 팁 공유

高洛峰
풀어 주다: 2017-03-16 16:16:25
원래의
1408명이 탐색했습니다.

텍스트 파일을 읽고 쓰는 방법은 무엇입니까?

실제 사례

특정 텍스트 파일 인코딩 형식이 변경되었습니다(예: UTF-8, GBK, BIG5). python2.x에서 사용하는 방법 및 python3.x는 각각 이 파일을 읽으시겠습니까?

해결책

python2와 python3의 차이점에 주의하세요

문자열 의 의미가 변경되었습니다:

python2 python3
str bytes
unicode str


python2.x는 파일을 쓰기 전에 유니코드를 인코딩하고 파일을 읽은 후 바이너리 문자열을 디코딩합니다.

>>> 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')
로그인 후 복사

Hello

python3.x의 open 함수 t의 텍스트 모드 지정, 인코딩은 인코딩 형식 지정

>>> 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
'你好'
로그인 후 복사

파일의 버퍼 설정 방법

실제 사례

파일 내용을 하드 디스크에 쓸 때 장치에서는 시스템 호출을 사용합니다. 이러한 유형의 I/O 작업은 I/O 작업 수를 줄이기 위해 일반적으로 버퍼를 사용합니다(시스템 호출을 할 수 있는 충분한 데이터가 있는 경우에만). 🎜> 캐시동작, 전체 버퍼링, 라인 버퍼링, 버퍼링 없음으로 구분됩니다.

파이썬에서

객체 파일의 버퍼링 컨텍스트를 설정하는 방법은 무엇입니까?

해결책

전체 버퍼링: 열기 함수의 버퍼링은 1보다 큰

정수 n으로 설정됩니다. n은 버퍼 크기

>>> f = open('demo2.txt', 'w', buffering=2048)
>>> f.write('+' * 1024)
>>> f.write('+' * 1023)
# 大于2048的时候就写入文件
>>> f.write('-' * 2)
>>> f.close()
로그인 후 복사
입니다. 라인 버퍼링: open 함수의 버퍼링이 1로 설정

>>> f = open('demo3.txt', 'w', buffering=1)
>>> f.write('abcd')
>>> f.write('1234')
# 只要加上\n就写入文件中
>>> f.write('\n')
>>> f.close()
로그인 후 복사
버퍼링 없음: open 함수의 버퍼링이 0으로 설정

>>> f = open('demo4.txt', 'w', buffering=0)
>>> f.write('a')
>>> f.write('b')
>>> f.close()
로그인 후 복사
파일을 메모리에 매핑하는 방법은 무엇입니까?

실제 사례

특정 바이너리 파일에 접근할 때 해당 파일을 메모리에 매핑하여 랜덤 접근이 가능하길 바랍니다(프레임버퍼 장치 파일)

일부 임베디드 장치. , 레지스터는 메모리 주소 공간에 주소가 지정되며 특정 범위의 /dev/mem을 매핑하여 이러한 레지스터에 액세스할 수 있습니다

여러 프로세스가 동일한 파일에 매핑되면 프로세스 통신도 달성할 수 있습니다

해결책

표준 라이브러리에 있는 m

map 모듈의 mmap() 함수를 사용하세요. 이 함수는 열린 파일 설명자를 매개변수로 필요로 합니다

다음 파일

[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'
로그인 후 복사
보기

[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
로그인 후 복사
슬라이스 수정

>>> m[4:8] = '\xff' * 4
로그인 후 복사
보기

[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
로그인 후 복사
보기

[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
로그인 후 복사

에 액세스하는 방법 파일 상태 ?

실제 사례

일부 프로젝트에서는 다음과 같은 파일 상태를 가져와야 합니다.

파일 형식(일반 파일, 디렉터리, 심볼릭 링크, 장치 파일) ...)

파일 접근 권한

파일의 마지막 접근/수정/노드 상태 변경 시간

일반 파일 크기

…..

해결책

현재 디렉토리에는 다음 파일이 있습니다

[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
로그인 후 복사
시스템 호출

os 모듈 아래에 세 개의 시스템 호출 stat가 있습니다. 표준 라이브러리 , fstat, lstat 파일 상태 가져오기

>>> 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
로그인 후 복사
파일의 액세스 권한을 가져옵니다. 이는 0보다 큰 경우에만 적용됩니다.

>>> s.st_mode & stat.S_IRUSR
256
>>> s.st_mode & stat.S_IXGRP
0
>>> s.st_mode & stat.S_IXOTH
0
로그인 후 복사
파일 수정 시간을 가져옵니다.

# 访问时间
>>> s.st_atime
1486197100.3384446
# 修改时间
>>> s.st_mtime
1486197100.3384446
# 状态更新时间
>>> s.st_ctime
1486197100.3384446
로그인 후 복사

타임스탬프변환

>>> 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)
로그인 후 복사
일반 파일의 크기 가져오기

>>> s.st_size
0
로그인 후 복사
바로가기 기능

아래의 일부 기능을 가져옵니다. 표준 라이브러리의 os.path를 사용하는 것이 더 편리합니다 Concise

파일 형식 판단

>>> os.path.isdir('dirs') 
True
>>> os.path.islink('lockfile')
True
>>> os.path.isfile('files') 
True
로그인 후 복사
파일 세 번

>>> os.path.getatime('files')
1486197100.3384445
>>> os.path.getmtime('files')
1486197100.3384445
>>> os.path.getctime('files')
1486197100.3384445
로그인 후 복사
파일 크기 가져오기

>>> os.path.getsize('files') 
0
로그인 후 복사
방법 임시 파일을 사용하려면?

실제 사례

어떤 프로젝트에서는 센서로부터 데이터를 수집하는데, 1G의 데이터가 수집된 후 데이터 분석을 수행하고 최종적으로 이렇게 큰 임시 데이터인 경우에만 저장합니다. 메모리는 많은 메모리 리소스를 소비합니다. 임시 파일을 사용하여 이러한 임시 데이터를 저장할 수 있습니다(외부 저장소)

임시 파일은 이름을 지정할 필요가 없으며

닫은 후 자동으로 삭제됩니다.

해결책

표준 라이브러리의 임시 파일 아래에 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'
로그인 후 복사
사용

위 내용은 Python에서 효율적인 파일 I/O 작업 처리를 사용하는 방법에 대한 팁 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿