文件的存储方式
在计算机中,文件是以二进制的方式保存在磁盘上的
文本文件和二进制文件
- 文本文件
可以使用文本编辑器软件查看,比如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)










