写给编程高手的Python教程(04) 文件操作

211 阅读1分钟

如何读取文本文件

字符串的编码与解码

s = u'你好' 
print(s.encode('utf8')) #编码
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8')) #解码

写入文本

f = open('test.txt', 'w', encoding='utf8')
f.write(s)
f.close()

读出文本

f = open('test.txt', 'r', encoding='utf8')
print(f.read())
f.close()

如何处理二进制文件

以下,以处理一个声音文件(wav格式)为例。

f = open('aa.wav','rb')
info = f.read(44) # wav文件头信息

读取文件信息。

from struct import unpack
print(unpack('h', b'\x01\x02'))
print(unpack('>h', b'\x01\x02'))
print(unpack('h', info[22:24]))
print(unpack('i', info[24:28]))
print(unpack('h', info[34:36]))

读取文件信息。

from array import array
f.seek(0, 2)
n = int((f.tell() - 44)/2)
buf = array('h', (0 for _ in range(n)))
f.seek(44)
f.readinto(buf)
print(buf[0])

读取文件信息。

for i in range(n):
    buf[i] = int(buf[i]/8)
f2 = open('bb.wav', 'wb')
f2.write(info)
buf.tofile(f2)
f2.close()

如何设置文件的缓冲

以下是代码执行完毕后,内容将直接写入文件,因为写入内容大于缓冲区内容的大小。

f = open('demo.txt', 'w')
f.write('abc')
f.write('+' * 4096)

buffering设置为1,是行缓冲,遇到换行符就会向缓冲区写入内容。

f = open('demo3.txt', 'w', buffering=1)
f.write('abcd')
f.write('1234')
f.write('\n')

buffering设置为10,是不设置缓冲。

如何将文件映射到内存

from mmap import mmap, ACCESS_READ
f = open('demo.txt', 'r')
m = mmap(f.fileno(), 0, access=ACCESS_READ)
print(type(m))
print(m[0])

如何访问文件的状态

from os import stat, lstat
s = stat('aa.wav')
print(s)
print(lstat('aa.wav'))
print(bin(s.st_mode))

from stat import S_IFDIR, S_IRUSR
# print(S_IFDIR(bin(s.st_mode)))
print(s.st_mode & S_IRUSR)

from os.path import isdir,getctime,getsize
print(isdir('aa.wav'))
print(getctime('aa.wav'))
print(getsize('demo.txt'))

如何使用临时文件

from tempfile import TemporaryFile, NamedTemporaryFile

f = TemporaryFile()
f.write('abcdef')
f.seek(0)
print(f.read(100))