使用file对象. 创建一个file对象, 告诉Python向文件中写数据, file对象表示对一个文件的链接, 而不是文件本身
但是如果试图打开或者想一个不存在的文件写数据, Python会自动创建该文件
如果文件不存在则创建文件, 如果文件存在则删除文件, 并创建一个新的文件

#coding:utf-8
#print ("hello world!~")
def make_text_file():
    a=open("D:\\FirstPythonDemo.txt","w") #"w" , w表示打开并写入文件. 默认是r; 表示读取文件. 但是如果文件不存在则会抛出异常
    a.write("This is First use Python write file")
    a.close()

make_text_file()

 创建一个程序, 如果文件存在, 则抛出错误信息. 如果不存在, 则创建文件

import os
def make_another_file():
    if os.path.isfile("D:\\FirstPythonDemo.txt"):
        print ("文件早已经存在!~~")
    else:
        b=open("D:\\FirstPythonDemo.txt","w")
        b.write("这是我写入的第二次测试")

make_another_file()

 使用参数a来向已存在的文件中追加内容

def add_some_text():
    f=open("D:\\FirstPythonDemo.txt","a")
    f.write("这是一次追加测试")


add_some_text()

""" 多行追加; 如果在"""中追加的行前面有空格, 则追加的也有空格

def even_some_text():
    e=open("D:\\FirstPythonDemo.txt","a")
    e.write("""这是多行追加的测试
我是第一行
      我是第二行
我是第三行
    """)

even_some_text()

 使用readline()读取文件 readline返回的字符串末尾是换行符. 如果要逐行读取文件, 则可以循环调用readline()方法

def readline_test():
    try:
        f=open("D:\\FirstPythonDemo1.txt","r")
        t = f.readline()
        print(t)
        raise
    except:     #except可以接收任何异常. 到目前所学到的类型异常有KeyError     TypeError
        return "文件并不存在"



print readline_test()
使用read来读取整个文件内容, 如果文件过大当然不合适
def read_test():
    try:
        f=open("D:\\FirstPythonDemo.txt","r")
        t = f.read()
        print(t)
        del t
        t.close()
        raise
    except:     #except可以接收任何异常. 到目前所学到的类型异常有KeyError     TypeError
        return "文件并不存在"

read_test()
使用循环和readline打印文本每行的字符长度
def print_line_lengths():
    a=open("C:\\Users\\LG\\Desktop\\DB_Column.txt","r") #这里可能没有配置好, 中文乱码
    text = a.readline()
    print  text
    #为什么在这里不提前将len计算出来:用到的时候再计算
    for line in text:
        print (len(line))

print_line_lengths()

 IOError  文件的读写异常
1. 试图打开并读取一个不存在的文件
2. 试图在一个不存在的目录中创建文件
3. 试图打开一个没有访问权限的文件
4. 试图在一个没有写权限的的目下创建文件
5. 磁盘错误/, 当读取网络文件时网络错误

使用os.path模块处理路径, 操作路径的模块                                    OSError
os.path在不同的系统上将路径展示为不同的结果

使用join组合路径, 使用split拆分路径

import os.path

#使用os.path.join方法组合路径
print (os.path.join("d:\\", "text"))
#输出结果    d:\text    这里的输出结果和书上说的不一致. . .

#使用split拆分路径
print(os.path.split("C:\\Users\\LG\\Desktop\\DB_Column.txt"))
# 这个和书上的结果一致:    ('C:\\Users\\LG\\Desktop', 'DB_Column.txt')

#见证Python的自动分解序列. 这点看起来很强大
parent_path, name = os.path.split("C:\\Users\\LG\\Desktop\\DB_Column.txt")
print (parent_path)
print(name)
#输出结果: C:\Users\LG\Desktop
#           DB_Column.txt

使用函数将一个路径递归分解至根目录

def split_fully(path):
    parent_path, name = os.path.split(path)
    if name == "":
        return (parent_path,)
    else:
        return split_fully(parent_path)+(name,) #调用函数自身, 进行分解

print split_fully("C:\Users\LG\Desktop\DB_Column.txt")

#输出结果:   ('C:\\', 'Users', 'LG', 'Desktop', 'DB_Column.txt')

 使用splitext获取文件扩展名

path, extname = os.path.splitext("C:\Users\LG\Desktop\DB_Column.txt")
print (extname)  #输出结果 .txt
#或者可以直接使用类似于数组方法
print (os.path.splitext("C:\Users\LG\Desktop\DB_Column.txt")[1])

 使用normpath 和 abspath 清理和规范化路径

print (os.path.normpath("C:\Users\LG\Desktop\..\DB_Column.txt"))
#输出结果   C:\Users\LG\DB_Column.txt . 这个函数我个人觉得应该不是常用函数

print (os.path.abspath("Net知识点.txt"))
#输出结果: 获取文件的物理绝对路径  C:\Users\LG\Desktop\FirstDemoPython\DB_Column.txt
print (os.path.abspath("..\DB_Column.txt"))
#输出结果: C:\Users\LG\Desktop\DB_Column.txt   输出取决于调用abspath时的当前路径

 使用exists判断文件是否存在

print (os.path.exists("C:\Users\LG\Desktop\Net在线图书商城项目_知识点.txt"))
#输出结果: True
#.decode('gbk').encode('utf-8')

 使用listdir遍历目录下所有的条目

print (os.listdir("C:\\Users\\LG\\Desktop"))
#输出结果:   ['EntityFramework.resources.dll', 'EntityFramework.SqlServer.resources.dll', 省略. . . 中文会有乱码

 使用函数列出某个目录下所有文件(完整路径), 逐行打印出来

def print_dir(dirPath):
    for item in os.listdir(dirPath):
        print (os.path.abspath(item))
        #print(os.path.join(dir_path,name))   #或者可以使用书上的这种方法
print_dir("C:\\Users\\LG\\Desktop\\MVCFirst\\MasterDemo\\MasterDemo\\bin\\zh-Hans")
'''
输出结果:  最好不要用中文
C:\Users\LG\Desktop\FirstDemoPython\EntityFramework.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\EntityFramework.SqlServer.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\Microsoft.AspNet.Identity.Core.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\Microsoft.AspNet.Identity.EntityFramework.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\Microsoft.AspNet.Identity.Owin.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\Microsoft.Owin.Host.SystemWeb.resources.dll
C:\Users\LG\Desktop\FirstDemoPython\Microsoft.Owin.resources.dll
'''

'gbk').encode('utf-8')解决中文乱码

def print_dir(dirPath):
    for item in os.listdir(dirPath):
        print (os.path.abspath(item)).decode('gbk').encode('utf-8')
        #print(os.path.join(dir_path,name))

print_dir("C:\\Users\\LG\\Desktop")

 使用sorted排序

print sorted((os.listdir("C:\\Users\\LG\\Desktop\\MVCFirst\\MasterDemo\\MasterDemo\\bin\\zh-Hans")))
#输出结果: ['EntityFramework.SqlServer.resources.dll', 'EntityFramework.resources.dll',

使用os.path.isfile和os.path.isdir判断文件类型 → 是文件还是目录 

print os.path.isfile("C:\\Users\\LG\\Desktop\\MVCFirst\\MasterDemo\\MasterDemo\\bin\\zh-Hans")
#1. isfile如果是文件返回True
#2. isdir如果是目录返回True
#3. 如果路径错误, 都返回false

 使用os.path.isdir和os.listdir递归遍历目录和getsize()和time等一些有用的函数

def print_tree(dir_path):
    for name in os.listdir(dir_path):
        full_path = os.path.join(dir_path,name)
        print(full_path)
        if os.path.isdir(full_path): #判断是否还是目录, 如果还是目录就递归调用
            print_tree(full_path)

print_tree("C:\\Users\\LG\\Desktop\\MVCFirst\\MasterDemo\\MasterDemo\\bin\\")
#输出结果: 不再复制. 就是将bin目录下所有文件遍历出来, 包括子目录中的

#os.path其它的一些有用函数和使用time格式化时间
#os.path.getsize()  #获取文件大小
#os.path.getatime()  # 最后一次读取或者执行文件时的时间 access
#os.path.getctime()  #文件的状态发生改变时, 发生变化. 比如写入/更改所有者/更改权限
#os.path.getmtime()  #文件最后一次被修改的时间. 写入内容时发生改变

print(os.path.getctime("C:\Users\LG\Desktop\DB_Column.txt".decode('gbk').encode('utf-8')))
#不使用time格式化后的结果: 1484748348.41 这个值是1970年起到文件上次被修改的时间之间的秒数
import time
print(time.ctime(os.path.getctime("C:\Users\LG\Desktop\DB_Column.txt".decode('gbk').encode('utf-8'))))
#使用time格式化后的结果: Wed Jan 18 22:05:48 2017
#print (time.ctime(time.time()))

 遍历输出目录下每个文件的文件名: 大小: 修改时间

def print_dir_info(dir_path):
    for name in os.listdir(dir_path):
        full_path = os.path.join(dir_path, name)
        file_size = os.path.getsize(full_path)/1024
        mod_time = time.ctime(os.path.getmtime(full_path))
        #格式化
        print("%-32s: %8d bytes, modified %s" % (name, file_size, mod_time))

print_dir_info("C:\\Users\\LG\\Desktop\\MVCFirst\\MasterDemo\\MasterDemo\\bin\\")
#输出结果:
#Newtonsoft.Json.xml             :      467 bytes, modified Sun Aug 03 20:33:56 2014

 文件各种操作重命名/移动/复制/删除和递归滚动日志示例:

#模块shutil中包含操作文件的函数. 可以对文件重命名/移动/复制/删除
import shutil
#shutil.move("源", "目标")  #移动文件(剪切). 源和目标路径相同, 则重命名文件 ; 注意: 一般来说不要使用os.rename来重命名文件
#shutil.copy("源","目标") #复制文件
#os.remove("filepath")  #删除文件  或者可以使用os.unlink("filepath")
# os.chmod("")  #修改文件权限

#日志滚动示例'   将web.log.1   web.log.2等;  逐一转换; 比如将web.log转变成web.log.1 将web.log.1转变成web.log.2
#难点: 必须首先要重命名老版本. 如果在重命名web.log.2之前将web.log.1重命名为web.log.2. 那么后者将会被重写(覆盖)
#使用递归

import os
import shutil

def make_version_path(path,version):
    #如果版本的后缀是0, 表示是当前版本. 直接返回全路径
    if version==0:
        return path
    else:
        return path+"."+str(version)#如果不是0, 表示需要更改的版本. 根据version将其后添加对应的值

def rotate(path, version=0):
    #如果是0, 这里old_path就是传入的path. 如果非0, old_path=path.version这样
    old_path=make_version_path(path,version)
    if not os.path.exists(old_path): #判断是否存在
        raise IOError("'%s' 不存在 " % path)
    new_path = make_version_path(path,version+1)#每一次version递增1
    if os.path.exists(new_path):
        rotate(path,version+1)
    shutil.move(old_path,new_path)#将老文件重命名
    rotate_log_file(path) #如果不存在, 就再调用一次,创建新的文件

#如果轮换一个不确定是否存在的日志文件. 则创建一个空的日志文件
def rotate_log_file(path):
    if not os.path.exists(path):
        #如果文件不存在, 则创建他
        new_file=file(path,"w")
        return
    #如果文件存在则直接开始转换
    rotate(path)

#测试 调用
rotate_log_file('C:\\Users\\LG\Desktop\\testlog\\logtest.txt')

 创建和删除目录

#os.mkdir("C:\\Users\\LG\Desktop\\testlog\\")  #创建父目录存在的dir, 如果父目录不存在则报错
#os.makedirs("C:\\Users\\LG\Desktop\\testlog\\")        #当父目录不存在的时候, 自动创建

#删除
# os.rmdir("C:\\Users\\LG\Desktop\\testlog\\") #只会删除单路径, 在此例中只会删除 testlog, 且testlog必须为空, 否则将会报错
#shutil.rmtree("C:\\Users\\LG\Desktop") #会删除所有文件, 慎用

 使用通配符

#列出C:\Program Files目录下名称以M开头的所有条目:
import glob

print ("%s \n" % glob.glob("C:\\Users\\LG\Desktop\\testlog\\l*"))

#使用通配符删除C: \databak目录下所有的备份文件
for path in  glob.glob("C:\\databak"):
    os.remove(path)

#返回当前目录下的所有txt文件
print (glob.glob("*\\*.txt"))

通配符表

          通配符                             

                匹配               

                        示例                             

*    

0个或多个任意字符

*.m* 匹配扩展名以m开头的任意文件

?

任意单个字符

? 匹配任意单字符. ???匹配任意三个字符

[. . .]

方括号中列出的任意一个字符

[AEIOU]* 匹配任意以大写原因开头的名称

[!. . .]

不在方括号内出现的任意一个字符

*[!s] 匹配不以s结尾的任意名称

 

[m-p]

匹配m , n , o , p中的任意一个字母

 

[!0-9]

匹配数字除外的任意字符