前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 文件操作

Python 文件操作

原创
作者头像
江小白
修改2019-06-19 17:12:35
1K0
修改2019-06-19 17:12:35
举报
文章被收录于专栏:左瞅瞅,右瞅瞅

文件IO 常见操作

代码语言:javascript
复制
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 语句块执行完的时候,会自动关闭文件对象

代码语言:javascript
复制
# 文件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 会被释放

代码语言:javascript
复制
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)都是类文件对象

代码语言:javascript
复制
from sys import stdout
f = stdout
print(type(f))
f.write('joker')

路径操作

pathlib 模块

from pathlib import Path

os 模块

代码语言:javascript
复制
import os

os.stat('/tmp/test')

os.chown(path,uid,gid)

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

shutil 模块

代码语言:javascript
复制
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)
代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
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 文件个事的流行

代码语言:javascript
复制
[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 库

代码语言:javascript
复制
dumps  对象序列化为bytes 对象
dump  对象序列化到文件对象,就是村人文件
loads  从bytes 对象反序列化
load  对象反序列化,从文件读取数据

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件IO 常见操作
  • mode 模式:
  • 文件指针
  • 文本模式下:
  • 二进制模式下:
  • buffering : 缓冲区
  • enconding : 编码,仅文本模式使用
  • 其他参数:
  • 上下文管理:
  • StringIO
  • BytesIO
  • file-like 对象
  • 路径操作
    • pathlib 模块
      • os 模块
        • shutil 模块
        • CSV 文件
          • configparser 模块
          • 序列化与反序列化
            • pickle 库
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档