文件
- 打开文件
open(文件名,访问模式)
#以只读模式打开文件,指针放在文件的开头。这是默认模式,不输入"r"也能执行。
f = open("demo.txt","r")
#写入模式打开文件。如果该文件已存在则将其覆盖,不存在则创建新文件。
f = open("demo.txt","w")
#追加写入模式打开文件。如果文件存在则在其末尾追加写入内容,不存在则创建新文件。
f = ("demo.txt","a")
常用的文件访问模式就这三种。
- 关闭文件
close()
#以写入模式打开文件
f = open("demo.txt","w")
#关闭这个文件
f.close()
补充:打开一次文件就关闭一次文件,打开三次就关闭三次。
- 读取文件
- read()
函数默认读取文件内全部数据。输入整数参数可以设定每次读取的字符数。
“`python
f = open(“demo.txt”,”r”)
#每次只读取5个字符
print(f.read(5))
```
- readlines()
读取全部数据,以换行符为单位,每一行内容存储在列表中。
```python
f = open("demo1.txt","r")
#列表储存每一行的内容
print(f.readlines())
#打印结果如下
['hello world!\n', 'hello aCandy!\n', 'hello Python!\n', 'hello Java!']
```
- readline()
以换行符为单位,每次只读取一行内容。
- 写入文件
write(输入内容)
#以写入方式打开文件
f = open("demo1.txt","w")
#向文件里输入内容
print(f.write("hello world!"))
- 复制文件
#获取用户要复制的文件名
fileName = input("请输入要复制的文件名:")
#以读取方式访问用户要复制的文件
f_read = open(fileName,"r")
#查找文件名中后缀前"."的位置,从右向左查找更准确。
findName = fileName.rfind(".")
#以"."的角标位置为准,将"."前的文件名字符加上"[附件]"加上"."后的文件字符得到一个新的文件名。
newName = fileName[:findName]+"[附件]"+fileName[findName:]
#写入新文件
f_write = open(newName,"w")
第一种方式
#读取的内容赋值
content = f_read.read()
#写入新文件
f_write.write(content)
第二种方式
for lineContent in f_read.readlines():
f_write.write(lineContent)
第三种方式
while True:
lineContent = f_read.readline()
if len(lineContent)>0:
f_write.write(lineContent)
else:
break
关闭两个读写文件
f_write.close()
f_read.close()
- with open() as x函数
常规读取文件方法
python
try:
f = open('/path/to/file', 'r')
print(f.read())
#无论文件读取是否出现异常都关闭文件。
finally:
f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
python
with open('/path/to/file', 'r') as f:
print(f.read())
文件定位
- tell()
定位当前文件读取的角标
f = open("demo2.txt","w+")
f.write("hello aCandy")
print(f.tell())
#打印结果如下
12
#角标定位到了12,如需要继续写入或读取,从此位置开始。
seek(偏移量,定位位置)
指定指针位置,偏移量很好理解。定位位置可输入三个数字,0代表文件开头,1表示当前位置,2表示文件末尾。os.rename()
文件重命名,需要导入os包
#导包
import os
#将"demo2.txt"重命名为"test.txt"
os.rename("demo2.txt","test.txt")
- os.remove()
删除文件
import os
#删除文件,支持路径。
os.remove("test.txt")
- mkdir()
创建文件夹
import os
#创建"aCandy"文件夹
os.mkdir("aCandy")
- getcwd()
获取当前路径
import os
#获取当前路径
print(os.getcwd())
- chdir()
修改当前路径
import os
#获取当前路径
print(os.getcwd())
#更改当前路径
os.chdir("./aCandy")
print(os.getcwd())
- listdir()
将当前路径下的所有文件名以列表形式存储。
import os
print(os.listdir())
类
以class定义,并首字母大写。类里面的每个函数第一个参数都必须是self.
#类名首字母大写,规则同其他语言。
class Dog():
#构造函数,两边各有两个下划线,且第一个参数必须是self
def __init__(self,name,age):
self.name = name
self.age = age
#自定函数,参数原则同上。
def sit(self):
print(self.name.title()+"is now sitting")
def roll_over(self):
print(self.name.title()+"rolled over")
#创建对象,并传值。
my_dog = Dog("willie",6)
#调用函数
my_dog.sit()
my_dog.roll_over()
#输出对象变量所赋的值
print("my dogs name is "+my_dog.name.title()+".")
print("my dogs age is "+(str)(my_dog.age)+" years old")
__init__(self,xxx)
Python类的构造函数,第一个参数必须是self。
注意:该函数两边各有两个下划线class Person(): #创建对象后,sel是该对象的引用,所以传入的参数可以self调用赋值。 def __init__(self,name,age): self.name = name self.age = age
添加属性
类中未定义的属性或变量可在创建对象后定义并赋值。#定义类 class Person(): #未输入构造函数,自定函数,还是需要在参数后加上self def eat(self): print("------eat-----") def demo(self): print("demo") #创建对象 demoPerson = Person() #调用函数 demoPerson.demo() demoPerson.eat() #"color"是类中未定义的属性,创建对象后亦可直接添加赋值。 demoPerson.color = "yello" demoPerson.high = "169" #输出亦不会抛出异常。 print(demoPerson.color)
- 继承
异常
try… except…
捕获异常关键字代码。#将可能出现异常的代码放入try代码块中 try: print(a) #如出现异常就执行except里面的代码。 except: print("not defind")
捕获多个异常,执行同种方式
try: open("desdfs.txt") print(a) #多个异常名时,需要用逗号分割,并包含括号。(Python2不需要括号) except (NameError,FileNotFoundError): print("not defind")
输出异常信息
关键字:as xxx(变量名)try: print(a) #"as"关键字后面加上自定的变量名用于存储异常信息 except (NameError,FileNotFoundError) as result: #将异常信息一同输出 print("not defind...%s"%result) #输出结果如下: not defind...name 'a' is not defined
捕获所有异常
异常名太多,无法一一指定时的异常捕获,并输出异常信息。
“`python
try:
print(a)需要在”except”后面加上关键字”Exception”关键字才能使用”as”关键字,否则会报错。
except Exception as result:
print(“not defind…%s”%result)
try… except… else…
当try里面的代码没有出现异常的时候才会执行else里面的代码。try: a= 10 print(a) except Exception as result: print("not defind...%s"%result) #try代码块中没有出现异常,所以else下的代码会被执行。 else: print("yes")
else作用:没有else语句,当执行完try语句后,无法知道是没有发生异常,还是发生了异常并被处理过了。通过else可以清楚的区分开。
try… finally…
finally:无论是否抛出异常都会执行的代码块。try: #a= 10 print(a) #抛出异常就执行。 except Exception as result: print("not defind...%s"%result) #不抛出异常才执行。 else: print("yes") #抛出与否都执行。 finally: print("一定会执行")
异常的传递
异常所在的代码块(或所在的函数)如果没有对其进行处理且有层层调用的情况,异常便会返回给调用该代码的代码块(或调用该代码的函数),多层调用便会多层传递,这其中任何一个调用代码对该异常代码进行处理都不会报错。如多个调用者都没有对其进行处理,返回到最终时则会进行默认处理,即报错。
#异常代码在demo1()函数,但未进行捕获。
def demo1():
print("demo1")
print(num)
#demo2()函数调用demo1()函数,未捕获异常。
def demo2():
print("demo2")
demo1()
#demo3()函数调用demo2()函数,进行异常捕获。通过层层传递,最终demo1()的异常会返回给demo3()
def demo3():
print("demo3")
try:
demo2()
#demo3()函数捕获到demo1()传递过来的异常。
except Exception as result:
print("....%s"%result)
#调用demo3()函数。
demo3()
抛出自定义异常
自定义异常需要继承Exception类
#自定义异常类,继承自Exception超类
class TestException(Exception):
#复写构造函数,自定义两个参数:字符长度和字符内容。
def __init__(self,length,num):
self.length = length
self.num = num
try:
#提示用户输入不超过两个长度的字符
num1 = input("请输入不超过2个长度的字符:")
#如果长度超过2,抛出异常。
if len(num1)>2:
#抛出异常关键字,"raise"。抛出自定义异常(同时创建该自定义异常类对象)
#传入错误字符的长度和错误字符
raise TestException(len(num1),num1)
#捕获异常,此时的"result"就是TestException对象。
except TestException as result:
print("---error-----")
#"result"此时就是异常类对象,所以可以通过调用对象内的变量获取值。
print("您输入错误,字符长度是%s,输入的内容是%s"%(result.length,result.num))
else:
print("输入正确")
- yield
带有该关键字的函数不是普通函数,是迭代器,顺序输出数据。