使用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] | 匹配数字除外的任意字符 | |