文件的存储方式
在计算机中,文件是以二进制的方式保存在磁盘上的
文本文件和二进制文件
- 文本文件
可以使用文本编辑器软件查看,比如cat命令
本质上还是二进制文件 - 二进制文件
保存的内容不是给人直接阅读的,而是提供给其他软件使用的
二进制文件不能使用文本编辑器打开
比如图片,音频,视频等
文件的基本操作
-
操作文件的套路
打开文件–》读写文件–〉关闭文件 -
相关的函数或方法
open,打开文件,并且返回一个文件对象
read/write,读写文件
close,关闭文件
#读取文件
fp=open('name')
txt=fp.read() #返回文件所有内容
fp.close()
文件指针
文件指针标记从哪个位置开始读取数据
但第一次打开文件时,文件指针在文件开头
执行read方法后,文件指针移动到了文件的末尾,再调用read方法,就读取不到内容
打开文件的方式
open(文件名,打开方式)
默认以只读方式打开
| 访问方式 | 说明|
|r|以只读方式打开文件,如果文件不存在抛出异常|
| w | 以只写方式打开文件,如果文件存在,会覆盖,不存在,则创建新文件 |
|a| 以追加方式打开文件,若文件已存在,文件指针在文件的末尾,若不存在,则创建文件|
还有r+,w+,a+等方式
readline,按行读取文件
with open("name") as fp:
text=fp.readline()
while (text!=''):
print(text,end='')
text=fp.readline()
以下代码是错误的,会导致缺行:
with open("name") as fp:
while fp.readline()!='':
print(fp.readline())
原因是:while里的fp.readline读取到了一行,将文件指针移到了下一行,循环里的fp.readline就是下一行的,导致缺失行
文件写入
使用write方法写入文件
小文件的复制
由于read方法是将所有内容一起读入内存,如果文件比较小,可以使用read方法
#小文件的复制,read是一次性读取文件到内存中,如果文件比较小,read还可以
fp_read=open("name")
fp_write=open("write",'w')
fp_write.write(fp_read.read())
大文件的复制
#大文件的复制,使用readline读取
with open("name") as fp_read:
with open("write1","w") as fp_write:
while True:
text=fp_read.readline()
if text=='':
break
fp_write.write(text)
with open("name") as fp_read:
with open("write2","w") as fp_write:
text=fp_read.readline()
while text!="":
fp_write.write(text)
text=fp_read.readline()
文件读写方式
目录操作 os模块
os.rename("write","my_write") #重命名文件,会抛出异常FileNotFoundError: [Errno 2] No such file or directory: 'write' -> 'my_write'
os.remove("write2") #删除文件,会抛出异常FileNotFoundError: [Errno 2] No such file or directory: 'write2'
print(os.listdir('../oslearn'))#列出文件夹下的所有文件和文件夹
os.mkdir("write2") #创建文件夹,会抛出异常FileExistsError: [Errno 17] File exists: 'write2'
os.rmdir("test3") #删除目录 会抛出异常FileNotFoundError: [Errno 2] No such file or directory: 'test3'
print(os.getcwd()) #获取当前目录
print(os.path.isdir("my_write"))#判断是否是文件夹
print(os.path.isfile("my_write"))#判断是否是文件
print(os.path.join(os.getcwd(),"test4"))#拼接路径
print(os.getenv("PATH")) #获取环境变量
os.walk()
通过在目录树中游走,输出目录中的文件名
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
top是需要遍历的目录
返回值是一个三元组(root,dirs,files),这个三元组整体是一个生成器:<generator object _walk at 0x7f8688eb3820>
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
所以,walk可以用于遍历目录
for item in os.walk('../oslearn'):
print(item)
输出:
('../oslearn', ['write2', 'conf'], ['my_write', 'demo2.py', '__init__.py', 'demo6.py', 'write1', 'demo1.py', 'demo5.py', 'demo4.py', 'name'])
('../oslearn/write2', [], [])
('../oslearn/conf', ['collection'], [])
('../oslearn/conf/collection', ['fraud'], [])
('../oslearn/conf/collection/fraud', [], ['collection_batch_input_output_preprod.conf', 'collection_batch_input_output.conf'])
遍历目录,并输出文件的路径
for root,dirs,files in os.walk('../oslearn'):
for file in files:
print(os.path.join(root,file))
for dir in dirs:
print(dir)