文件操作
常见的文件类型:
- txt
- html
- csv
- json
文件的操作流程:
- 打开 open()
- 读、写 read()[readline()逐行读取/readlines()多行读取]/write()
- 关闭 close()
用途 | 方法 | 功能 |
---|---|---|
打开文件 | f=open(file) | 打开文件 |
关闭文件 | f.close() | 关闭文件 |
读取文件 | f.read(size) | 从文件中读取(指定字节数),未指定读取所有数据. |
读取文件 | f.readline(size) | 从文件中读取整行 包括换行符 |
读取文件 | f.readlines(size) | 从文件中读取所有行,返回列表 |
写入文件 | f.write(str) | 将字符串写入文件,返回字符串长度 |
写入文件 | f.writeline(seq) | 向文件写入一个序列、字符串、列表,需要换行手动加入换行符 |
刷新文件 | f.flush() | 刷新文件缓冲,直接把内容缓冲的数据写入文件 |
定位文件 | f.seek(offset) | 设置文件的当前位置,即指针位置 |
定位文件 | f.tell() | 返回文件的当前位置,即指针位置 |
文件的打开与关闭
打开
- 内置函数open,创建一个file对象,之后才可以调用它相关的方法
格式:file_object=open(file_name,[mode];[encoding],buffering)
- open的参数
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- 解释
file_object open() 返回的文件对象
file 要打开的文件
mode 指定的模式:只读写入,等等(下表),默认为只读
encoding 指定文件的编码方式,通常使用’utf-8’、‘GBK’
buffering 小于0:寄存区大小为系统默认,0:不会寄存,1:访问文件时会寄存行,大于1:寄存区的缓存大小
mode
mode | 操作 | 文件不存在时 | 可否读、写 |
---|---|---|---|
r | 读取文件内容 | 报错 | 只可读 |
w | 覆盖前内容写入 | 创建文件 | 只可写 |
a | 保留前内容写入 | 创建文件 | 只可写 |
r+ | 覆盖前读写内容 | 报错 | 可读写 |
w+ | 覆盖前内容写入 | 创建文件 | 可读写 |
a+ | 保留前内容写入、读 | 创建文件 | 可读写 |
注
1.'r’从指针位置开始写入,当已经读过内容(read),指针来到内容末端,此时又会从末尾追加写入
’2.rb’等带’b’的都是以二进制格式打开文件,其用法相同
3.’a+‘等方式打开后指针在内容末端,此时读取会没有内容只有一个换行符,需要在read前面加一个seek(0,0)将指针指向内容开头
- 文件对象的属性
属性 | 描述 |
---|---|
f.name | 返回文件的名称 |
f.mode | 返回打开文件的访问模式 |
f.closed | 返回文件是否已经关闭,以关返回True |
f=open('青花瓷.txt','r',encoding='utf-8')
f.read()
print(f.name)
print(f.mode)
print(f.closed)
f.close()
print(f.closed)
结果
青花瓷.txt
r
False
True
关闭
f.close( )
目的:打开后文件一直使用进程,关闭后可以节省计算机资源和提供性能.
文件的读取
- read
f=open('GreenFlowerPorcelain.txt','r')
print(f.read(4))
print(f.read(4))
f.close()
1 G ###读取文件前4个字符
reen ####再读取4个字符(指针向后移动了4)
- readline
f=open('GreenFlowerPorcelain.txt','r')
f1=f.readline()
f2=f.readline()
f3=f.readline()
print(f1,f2,f3,sep='')
f.close()
1 Green Flower Porcelain
2 You are the face that has changed my whole world.
3 You are the face that I see everywhere I go.
readline加参数也读取字符数,如果没有读完下再readline不会直接从下一行,而是继续读该行,内容读完后不管是否把字符读完,直接换行结束,但是read会继续读取下一行的内容
- readlines逐行读取内容,将每一行的内容作为一个列表的一个元素,返回该列表.
文件的写入
-
write
write()需要传入一个字符串做为参数,否则会报错
-
writelines
writelines()既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件
writelines必须传入的是字符序列,不能是数字序列 如:li = [1,2,3,4,5]也会报错
定位读取
-
f.tell()
获取文件的当前位置
-
f.seek(offset[,from])
- offset 为移动的字节数,
- from为指定的偏移位置
- 0 从开头偏移
- 1 从当前位置偏移
- 2 从末尾偏移
对于非二进制的文本文件,不允许使用偏移定位
with open('./data/31602430.txt','r') as f:##(访问在同一目录下的文件夹内文件用'./文件夹名')
f.seek(0) ###从头开始读
print(f.read()) ###打印内容
OS 模块(Operator System)
python标准库中用于访问操作系统功能的模块。
使用OS模块提供的接口,能够实现跨平台访问。
系统操作
- os.sep 用于查看系统路径的分隔符
- windows:’\’(2个斜线,第一个是转义字符)
- ubuntu:’/’
- os.name 显示当前使用的平台
- window :‘nt’
- linux/unix : ‘posix’
- os.getenv() : 读取环境变量
- os.getcwd():获取当前路径
>>> import os
>>> os.sep
'\\'
>>> os.name
'nt'
>>> os.getcwd()
'D:\\python\\python3.7'
目录(direction)操作(增删改查)
- os.listdir():返回指定目录下的所有文件和目录名(默认当前目录)
import os
print(os.listdir()) 默认当前目录
print(os.listdir('E:/WeGame')) 指定目录
['111.jpg', 'bird.png', 'data', 'pat', 'pygames_try.py', 'text.py', '后前和.py', '短学期']
['Download', 'downloading', 'rail_apps', 'Speed.log']
- 目录的创建
- os.mkdir(path) :创建目录,但仅创建一级目录
- os.makedirs(path):创建目录,支持创建多级目录
#####mkdir#####
import os
print(os.listdir())
os.mkdir('hello')
print(os.listdir())
结果
['111.jpg', 'bird.png', 'data', 'pat', 'pygames_try.py', 'text.py', '后前和.py', '短学期']
['111.jpg', 'bird.png', 'data', 'hello', 'pat', 'pygames_try.py', 'text.py', '后前和.py', '短学期']
#####makedirs#####
import os
print(os.listdir())
os.makedirs('happy/fun')
print(os.listdir('happy'))
结果
['111.jpg', 'bird.png', 'data', 'hello', 'pat', 'pygames_try.py', 'text.py', '后前和.py', '短学期']
['fun']
- 目录/文件的删除
- os.rmdir():删除一级目录
- os.removedirs():删除多级目录
- os.remove(path):删除文件(只能是文件,目录下的文件)
import os
print(os.listdir())
os.rmdir('hello')
print(os.listdir())
结果
['111.jpg', 'bird.png', 'data', 'hello', 'pat', 'pygames_try.py', 'text.py']
['111.jpg', 'bird.png', 'data', 'pat', 'pygames_try.py', 'text.py']
只有当目录(文件夹)为空时,该目录才能删除,否则报错
-
更改路径
- chdir(path): change direction 将当前工作目录更改到上一级目录
import os
print(os.getcwd())
os.chdir('..') ##表示上一级目录
print(os.getcwd())
结果
C:/Users/12273/Desktop/python
C:/Users/12273/Desktop
-
更改文件名称
os.rename(old_name,new_name) :只能更改当前文件名
os.renames() :可以同时更改上一级目录名称
判断文件是否存在
- os.path.exists(path):判断文件或者目录是否存在,存在返回True;否则False.
import os
print(os.listdir())
print(os.path.exists('pat'))
print(os.path.exists('pate'))
结果
['111.jpg', 'bird.png', 'data', 'hello', 'pat', 'pygames_try.py', 'text.py']
True
False
- os.path.isfile(path):判断是否为文件,是返回True;否则False.
- os.path.isdir(path):判断是否为目录,是返回True;否则False.
import os
print(os.path.isfile('text.py'))
print(os.path.isdir('text.py'))
结果
True
False
- 拓展:
- os.path.dirname(path) :返回文件路径,
- os.path.basename(path):返回文件的文件名
- os.path.getsize(name): 返回文件的大小(单位为byte)
- os.path.abspath(path):返回文件的绝对路径
- os.path.join(path,name):连接目录与文件名、目录
- os.path.split(path):返回一个元组,把路径和文件名作为2个元素存入元组
- 查看文件的时间
- os.path.getmtime(path) :返回文件目录的最后修改时间,返回格式为time.time(秒数)时间戳
- os.path.getatime(path) :返回文件目录的最后访问时间,返回格式为time.time(秒数)时间戳
- os.path.getctime(path) :返回文件目录的创建时间,返回格式为time.time(秒数)时间戳
import os
import time
print(time.strftime('%Y-%m-%d %X',time.localtime(os.path.getmtime('text.py'))))
print(time.strftime('%Y-%m-%d %X',time.localtime(os.path.getatime('text.py'))))
print(time.strftime('%Y-%m-%d %X',time.localtime(os.path.getctime('text.py'))))
结果 ####将时间戳改为正常时间
2019-07-22 17:18:31 ###最后修改时间
2019-07-22 17:18:31 ###最后访问时间
2019-07-01 13:51:19 ######创建时间
- 获取文件和目录
- os.walk()必须给一个参数(目录),返回该目录内的文件(子目录),及子目录的文件
import os
for i in os.walk('C:/Users/12273/Desktop/python'):
print(i)
结果
('C:/Users/12273/Desktop/python', ['data', 'pygame', '短学期'], ['text.py', '后前和.py'])
('C:/Users/12273/Desktop/python\\data', [], [ 'GreenFlowerPorcelain.txt', '青花瓷.txt'])
('C:/Users/12273/Desktop/python\\pygame', [], ['111.jpg', 'bird.png', 'pygames_try.py'])
('C:/Users/12273/Desktop/python\\短学期', [], ['alluser.txt', 'users.txt', '爬虫(二级页面).py', '爬虫.py', '银行管理系统.py'])
综合应用
import os
print(os.getcwd()) ##获取当前的路径
os.mkdir('year') ##在当前路径新建目录
for i in range(1,7):
os.makedirs('year/0'+str(i)) ##在生成目录下新建文件
print(os.listdir('year')) ##显示目录下的文件
os.rmdir('year/06') ##删除目录下的文件
print(os.listdir('year')) ##显示目录下的文件
for i,j in enumerate(os.listdir('year')):
os.rename('./year/'+j,'./year/'+str(i+1)) ##给目录下的文件改名
print(os.listdir('year')) ##显示目录下的文件名
os.renames('./year/5','./month/6') ##更改目录及其下的一个文件名
print(os.listdir('month'),os.listdir('year')) ##显示目录
结果
C:/Users/12273/Desktop/python
['01', '02', '03', '04', '05', '06']
['01', '02', '03', '04', '05']
['1', '2', '3', '4', '5']
['6'] ['1', '2', '3', '4'] ##由于year目录下还有其他文件存在,所有year目录没有被删除
注:rename更改文件及其目录名称时,如果该目录下还有其他文件,则该目录依然存在,如上所示,当该目录只包含该文件,该目录就会消失,再打印其目录下文件(listdir())会报错(系统找不到指定的路径)
补充
pysnooper
pysnooper.snoop() 可以用来调试函数的运行,方便找错.