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(bbinary data)
38 
39 >>> s.getvalue()
40 
41 bbinary 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(bHello World)
24 
25 >>> m1 = memoryview(buf)
26 
27 >>> m2 = m1[-5:]
28 
29 >>> m2
30 
31 <memory at 0x100681390>
32 
33 >>> m2[:] = bWORLD
34 
35 >>> buf
36 
37 bytearray(bHello 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(代码片段

常用python日期日志获取内容循环的代码片段

是否可以动态编译和执行 C# 代码片段?

使用 Python 代码片段编写 LaTeX 文档

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段