python 文件流
Posted zeopean
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 文件流相关的知识,希望对你有一定的参考价值。
open | write | read
>>> with open(‘demo.txt‘ , ‘wt‘) as f: #以文本(wt)形式写入操作 ... f.write("hello guohai") 12 >>> with open(‘demo.txt‘ , ‘rt‘) as f: #以文本(rt)形式读取操作 ... data = f.read() >>> data ‘hello guohai‘ >>> with open(‘demo.txt‘ , ‘at‘) as f: #以文本(at)形式追加操作 ... f.write(‘hello zeopean‘) 13 >>> with open(‘demo.txt‘ , ‘rt‘) as f: ... data = f.read() >>> data ‘hello guohaihello zeopean‘ -- print 输出到文件中 with open(‘d:/work/test.txt‘, ‘wt‘) as f: print(‘Hello World!‘, file=f)
-- 二进制读写
如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码
操作。比如:
1 with open(‘somefile.bin‘, ‘rb‘) as f: 2 3 data = f.read(16) 4 5 text = data.decode(‘utf-8‘) 6 7 with open(‘somefile.bin‘, ‘wb‘) as f: 8 9 text = ‘Hello World‘ 10 11 f.write(text.encode(‘utf-8‘)) 12 13
-- 判断文件是否存在
>>> import os >>> if not os.path.exists(‘somefile‘): ... with open(‘somefile‘, ‘wt‘) as f: ... f.write(‘Hello\n‘) ... else: ... print(‘File already exists!‘) ... File already exists!
StringIO | BytesIO
1 -- StringIO 2 3 >>> s = io.StringIO() 4 5 >>> s.write(‘Hello World\n‘) 6 7 12 8 9 >>> print(‘This is a test‘, file=s) 10 11 15 12 13 >>> s.getvalue() 14 15 ‘Hello World\nThis is a test\n‘ 16 17 >>> 18 19 >>> s = io.StringIO(‘Hello\nWorld\n‘) 20 21 >>> s.read(4) 22 23 ‘Hell‘ 24 25 >>> s.read() 26 27 ‘o\nWorld\n‘ 28 29 >>> 30 31 32 33 -- BytesIO 34 35 >>> s = io.BytesIO() 36 37 >>> s.write(b‘binary data‘) 38 39 >>> s.getvalue() 40 41 b‘binary data‘ 42 43 >>>
readinto | bytearray | memoryview
1 record_size = 32 2 3 buf = bytearray(record_size) 4 5 with open(‘somefile‘, ‘rb‘) as f: 6 7 while True: 8 9 n = f.readinto(buf) 10 11 if n < record_size: 12 13 break 14 15 16 17 另外有一个有趣特性就是 memoryview ,它可以通过零复制的方式对已存在的缓冲 18 19 区执行切片操作,甚至还能修改它的内容。比如: 20 21 >>> buf 22 23 bytearray(b‘Hello World‘) 24 25 >>> m1 = memoryview(buf) 26 27 >>> m2 = m1[-5:] 28 29 >>> m2 30 31 <memory at 0x100681390> 32 33 >>> m2[:] = b‘WORLD‘ 34 35 >>> buf 36 37 bytearray(b‘Hello WORLD‘)
mmap
-- 内存映射的二进制文件 import os import mmap def memory_map(filename , access=mmap.ACCESS_WRITE): size = os.path.getsize(filename) fd = os.open(filename , os.O_RDWR) return mmap.mmap(fd ,size , access=access) size = 1000000 with open(‘data‘ , ‘wb‘) as f: f.seek(size - 1) f.write(b‘\x00‘) m = memory_map(‘data‘) print(len(m)) print(m[0:10]) # print(b‘hello daming‘ , file=m[0:11]) # m.close() with open(‘data‘ ,‘rb‘) as f: print(f.read(11))
os.path
-- basename | dirname | join | splitext | expanduser
1 import os 2 3 >>> path = ‘demo.bin‘ 4 5 >>> os.path.basename(path) #文件名 6 7 ‘demo.bin‘ 8 9 >>> os.path.dirname(path) #文件路径 10 11 ‘‘ 12 13 >>> os.path.join(‘tmp‘,‘data‘ , os.path.basename(path)) #路径拼接 14 15 ‘tmp\\data\\demo.bin‘ 16 17 >>> path = ‘~/data/data.bin‘ 18 19 >>> os.path.expanduser(path) #系统路径 20 21 ‘C:\\Users\\Administrator/data/data.bin‘ 22 23 >>> os.path.splitext(path) #获取后缀名 24 25 (‘~/data/data‘, ‘.bin‘)
-- exists | isdir | islink | realpath
os.path.exists(‘/etc/passwd‘) #判断文件是否存在 >>> os.path.isdir(‘user.data‘) #判断是否是目录 False >>> os.path.islink(‘demo.bin‘) #判断是否是超链接 False >>> os.path.realpath(‘demo.bin‘) #获取文件的绝对路径 ‘E:\\zeopean\\pycode\\pyfunc\\demo.bin‘
-- getmtime | getsize 获取元数据
1 >>> os.path.getmtime(‘demo.txt‘) 2 3 1459387735.7783203 4 5 >>> import time 6 7 >>> time.ctime(os.path.getmtime(‘demo.bin‘)) 8 9 ‘Thu Mar 31 10:27:36 2016‘ 10 11 >>> os.path.getsize(‘demo.txt‘) 12 13 47
-- listdir
>>> names = os.listdir(‘.‘) >>> names [‘closure.func.py‘, ‘closureInstance.py‘, ‘data‘, ‘demo.bin‘, ‘demo.txt‘, ‘file. txt‘, ‘make_element.py‘, ‘mmap.demo.py‘, ‘readinto.demo.py‘, ‘yield.func.py‘]
tempfile
1 --临时文件 TemporaryFile 2 3 from tempfile import TemporaryFile 4 5 f = TemporaryFile(‘w+t‘) 6 7 # Use the temporary file 8 9 ... 10 11 f.close() 12 13 14 15 --有名字的临时文件 NamedTemporaryFile 16 17 from tempfile import NamedTemporaryFile 18 19 with NamedTemporaryFile(‘w+t‘) as f: 20 21 print(‘filename is:‘, f.name) 22 23 24 25 -- 临时目录 TemporaryDirectory 26 27 from tempfile import TemporaryDirectory 28 29 with TemporaryDirectory() as dirname: 30 31 print(‘dirname is:‘, dirname) 32 33 34 35 -- 插件临时文件 mkstemp | mkdtemp 36 37 >>> import tempfile 38 39 >>> tempfile.mkstemp() 40 41 (3, ‘C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\tmp_jbpp74i‘) 42 43 >>> tempfile.mkdtemp() 44 45 ‘C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\tmpkwsqedpa‘ 46 47 48 49 -- 获取临时文件名 gettempdir 50 51 import tempfile 52 53 tempfile.gettempdir() 54 55 ‘C:\\Users\\ADMINI~1\\AppData\\Local\\Temp‘
Pickle
1 -- 序列化对象 2 3 >>> import pickle 4 5 >>> f = open(‘somedata‘, ‘wb‘) 6 7 >>> pickle.dump([1, 2, 3, 4], f) 8 9 >>> pickle.dump(‘hello‘, f) 10 11 >>> pickle.dump({‘Apple‘, ‘Pear‘, ‘Banana‘}, f) 12 13 >>> f.close() 14 15 >>> f = open(‘somedata‘, ‘rb‘) 16 17 >>> pickle.load(f) 18 19 [1, 2, 3, 4] 20 21 >>> pickle.load(f) 22 23 ‘hello‘ 24 25 >>> pickle.load(f) 26 27 {‘Apple‘, ‘Pear‘, ‘Banana‘}
以上是关于python 文件流的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段