Python 文件操作

文件IO 常见操作

open      打开     close         关闭        seek    文件指针操作
read      读取     readline      行读取       tell     指针位置
write     写入     readlines     多行读取

文件操作中,最常用操作就是读和写

文件访问的模式又两种:

文本模式 和 二进制模式

不同模式下,操作函数不尽相同,表现得结果业不一样

open 得参数

file 打开或者要创建得文件名。如果不指定路径,默认是当前路径

mode 模式:

r 缺省的,表示只读打开

w 只写打开

x 创建并写入一个新文件

a 写入打开,如果文件存在,则追加

b 二进制模式

t 缺省的,文本模式

+ 读写打开一个文件。给原来只读、只写方式打开提供缺失的读或写的能力

文件指针

文件指针,指向当前字节位置

文本模式下:

whence 0 缺省值,表示从头开始,offest 只能正整数

whence 1 表示从当前位置,offest 只接受 0

whence 2 表示从EOF 开始,offset 只接受 0

二进制模式下:

whence 0 缺省值,表示从头开始,offest 只能正整数

whence 1 表示从当前位置,offest 可正可负

whence 2 表示从EOF 开始,offest 可正可负

buffering : 缓冲区

-1 表示使用缺省大小的buffer 。 如果是二进制模式,使用io.DEFAULT_BUEFER_SIZE值,默认是4096或者8192。如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。

enconding : 编码,仅文本模式使用

None 表示使用缺省编码,依赖操作系统。

其他参数:

closedfd

关闭文件描述符,True 表示关闭它。False 会在文件关闭后保持这个描述符。

上下文管理:

使用with...as...关键字

上下文管理的语句块并不会开启新的作用域

with 语句块执行完的时候,会自动关闭文件对象

# 文件copy 简单实现
filename1 = '/tmp/test.txt'
filename2 = '/tmp/test1.txt'


f = open(filename1,'w+')
lines = ['abc','123','magedu']
f.writelines('\n'.join(lines))
f.seek(0)
print(f.read())
f.close()

def copy(src,dest):
    with open(src) as f1:
        with open(dest,'w') as f2:
            f2.write(f1.read())
copy(filename1,filename2)

StringIO

一般来说,磁盘的操作比内存的操作要慢的多,内存足够的情况下,一半的优化思路是少落地,减少磁盘IO 的过程,可以大大提高程序的运行效率

BytesIO

io 模块中的类(from io import BytesIO)

内存中,开辟的一个二进制模式的buffer,可以向文件对象一样操作

当close 方法被调用的时候,这个buffer 会被释放

from io import BytesIO
bio = BytesIO()
print(bio.readable(),bio.writable(),bio.seekable())
bio.write(b"joker\nPython")
bio.seek(0)
print(bio.readline())
bio.seek(0)
print(bio.read())
print(bio.getvalue())   # 无视指针,输出全部内容
bio.close()

file-like 对象

类文件对象,可以相文件对象一样操作

socket 对象,输入输出对象(stdin,stdout)都是类文件对象

from sys import stdout
f = stdout
print(type(f))
f.write('joker')

路径操作

pathlib 模块

from pathlib import Path

os 模块

import os

os.stat('/tmp/test')

os.chown(path,uid,gid)

改变文件的属主,属组,但是需要足够的权限

shutil 模块

import shutil

with open('/tmp/test','w+') as f1:
    f1.write('abcd\n1234')
    f1.flush()
    f1.seek(0)
    with open('/tmp/test1','w+') as f2:
        shutil.copyfileobj(f1,f2)
copyfile(src,dst,*,follow_symlinks=True)
复制文件内容,不含元数据。src,dst 为文件的路径字符串
本质上调用的就是copyfilebj,所以不带元数据二进制内容复制。

copymode(src,dst,*,foolow_symlinks=True)
仅仅复制权限
copystat(src,dst,*,follow_symlinks=True)
rm 删除
shutil.rmtree(path,ignore_errors=False,onerror=None)
递归删除。如同rm -rf 一样危险,慎用。
move 移动
move(src,dst,copy_function=copy2)
递归移动文件,目录到目标,返回目标

CSV 文件

https://www.ietf.org/rfc/rfc4180.txt

逗号分割值Comma-Separated Values.

CSV 是一个被行分割符,列分隔符划分成行和列的文本文件。

csv 不指定字符编码

h行分隔符为\r\n,最后一行可以没有换行符

列分隔符常为逗号或者制表符。

每一行称为一条记录record

字段可以使用双引号括起来,也可以不使用。如果字段中出现了双引号,逗号,换行符必须使用双引号括起来。如果字段的值是双引号,使用俩个双引号表示一个转义。

表头可选,和字段列对齐就行。

from pathlib import Path

p = Path('/tmp/mycsv/test.csv')
parent = p.parent
if not parent.exists():
    parent.mkdir(parents=True)
    
csv_body = '''\
id,name,age,comment
1,joker,18,"I'm 18"
2,ls,20,"this is a ""test"" string."
3,ww,23,"你好


世界"
'''
p.write_text(csv_body)

ini 文件处理

作为配置文件,ini 文件个事的流行

[DEFAULT]
a = test

[mysql]
default-character-set=utf8

[mysqld]
datadir = /dbserver/data
port = 3600
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

configparser 模块

configparaser模块的ConfigParser类

可以将section当作key,section 存储着键值对组成的字典, 可以把ini配置文件当做一个嵌套的字典。默认使用的是有序字典。

序列化与反序列化

serialization 序列化

将内存中对象存储下来,把他们变为一个个字节。-> 二进制

deserialization 反序列化

将文件的一个个字节恢复成内存中对象。 <- 二进制

序列化保存到文件就是持久化。

可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化。

pickle 库

dumps  对象序列化为bytes 对象
dump  对象序列化到文件对象,就是村人文件
loads  从bytes 对象反序列化
load  对象反序列化,从文件读取数据

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券