1.print
用了这么久,今天详细的看看print函数
print可以将它接收到的零个或者多个用逗号隔开的表达式,转换为字符串输出到屏幕上.
print("python 是解释型的语言...")
2.从键盘上读取
在py2中有raw_input函数,但是在py3中进行了整合只保留了input函数
input:会接收输入的任意字符串(有人说也可以是表达式并且将表达式转换为字符串,但是验证后发现不行)
str = input("qingshuru ")
print(str)
3. 打开和关闭文件
open函数:打开文件
open("filename",access_mode,buffering)
filename:是文件名加路径,其中的path可以是绝对路径也可以是相对路径.
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
access_mode:决定了打开文件的模式,是只读,只写,读写,还是追加等等. 这个参数是非强制的可以不写,默认是只读.
buffering:设置是否有寄存,0不会有寄存,1会寄存行设置大于0的数字代表缓冲区的大小,如果是负数代表使用系统默认的缓冲区大小.
File对象的属性
name属性:返回文件的名字
mode属性:返回文件打开的访问模式
closed属性:判断文件是否关闭
print(file.name)
print(file.closed)
print(file.mode)
file.close()
file对象的类型.
file = open("诗词")
print(file)
print(type(file))
file.close()
在这里看到file对象的类型.是_io.TextIOWrapper类型.同一时刻文件只能被一个对象open(纯属猜测没有办法验证).而且每次打开一个文件必须不能忘记写close语句(虽然python有自动关闭文件的机制,此机制实在open所在的模块执行完成后自动执行close方法的)
打开文件的异常类型
1.没有打开文件使用read方法报的异常
2.没有打开文件使用write方法报的异常
write方法
将任何的字符串写入一个打开的文件里,在这里python字符串可以是二进制文件,而不仅仅是数字,write方法不会在结尾自动添加'\n'换行符
file = open("诗词",'w')
file.write("hello world")
file.close()
执行代码之后
so:可以知道write方法写入字符串会将原有文件里有的内容清空掉,然后才会写入新的内容.但是清空实在哪一行代码发生的呢.
我将代码进行了修改.
file = open("诗词",'w')
#file.write("hello world")
file.close()
此时我们发现将文件中内容清空的操作是在open模式为写的状态的时候执行的.
验证自动创建文件
file = open("诗词",'w')
file.write("hello world")
file.close()
执行上面的代码之后自动创建了 诗词.txt 文件
同样的创建文件操作是在执行open函数的时候执行的.
read方法
从一个打开的文件中读取字符串
file = open("诗词",'r',encoding='utf-8')
r_file = file.read()
print(r_file)
file.close()
从上面我们可以知道,当读的 时候read()的参数如果是空,就会将文件内所有的内容读出来.
file = open("诗词",'r',encoding='utf-8')
r_file = file.read(5)
print(r_file)
file.close()
现在在read中加入一个参数,代表的是读取几个字符.
在读的时候要先了解一个光标的概念,每次读取几个字符后光标就会往后移动,再次读取的时候光标会在现有的基础上向后移动.所以读取的就是不同的内容.
tell方法
tell:返回光标此时在文件中的位置.
seek:改变光标在文件中的位置,seek后面有两个参数,其中第一个参数代表偏移量偏移量为整数向后移动为负数向前移动,第二个参数有三个数字,分别是0,1,2
同时说一下seek方法是没有返回值的.
0:光标在文件中的绝对位置,1:光标在文件的当前位置 2:光标在文件的结尾的位置
例如
seek(6,0):就是将光标向文本结束的方向移动6个字节的位置.
seek(-6,1):这个按照我的理解就是光标在当前位置向前移动6个字节.(验证总是出错没有证实,希望哪位大神帮忙指正)
seek(-9,2):这个就是从文件结尾的位置将光标向前移动9个字节(验证也是出错,希望大神们指正)
在第二个参数是1,和2的时候报出的是这样的异常
看这个报错大概就是,第二个参数不能指定0意外的数字.(本人菜鸟没有学过python2,不知道在python2中是否参数可以是1,和2)
#打开一个文件
file = open("诗词",'r+',encoding="utf-8")
#现在开始读取5个字符(中文占三个字节)
print(file.read(5))
#输出光标的位置
print(file.tell())
#重新定位光标的位置
file.seek(0,0)
#读取四个字符
print(file.read(4))
#输出光标的字节位置
print(file.tell())
file.close()
重命名文件
重命名文件需要导入包os
#重命名文件
os.rename("诗词","诗词歌赋")
删除文件
remove方法
#删除文件的方法
os.remove("诗词歌赋")
此时可以看到 诗词歌赋.txt文件已经被移除了
新建目录
#创建一个新的目录
os.mkdir("新建目录名字")
ok:新建目录完成
改变当前目录
chdir方法;改变当前目录
os.chdir("新建目录名字")
#显示当前的目录的名字
print(os.getcwd())
显示当前的工作目录
getcwd方法显示当前的工作目录
#显示当前的目录的名字
print(os.getcwd())
print(type(os.getcwd()))
getwcd:会返回一个字符串来表示当前目录的名字
删除目录
rmdir:删除目录
os.rmdir("新建目录名字")
ok:you can see the result.这个目录已经被删除掉了.
flush刷新缓冲区
flush方法刷新缓冲区,将缓冲区数据立即写入文件,随后清空缓冲区.
file = open("诗词歌赋",'r+',encoding="utf-8")
print(file.name)
file.flush()
file.close()
然并卵,暂时还没有找到验证flush作用的方法.
fileno():返回一个整形的数字,来描述这个文件
file1 = open("诗词歌赋")
print(file1.name)
print(file1.fileno())
file2 = open("诗词")
print(file2.name)
print(file2.fileno())
可以fileno每一个不同的文件会返回一个不同的no值,是唯一的.
判断文件是否连接到设备终端
isatty方法,判断文件是否连接到了设备终端.
#是否连接到一个设备终端
file = open("诗词歌赋","r+",encoding="utf-8")
boolean_flag = file.isatty()
print(boolean_flag)
file.close()
false:代表文件没有连接到一个终端设备
true:代表连接到了一个终端设备
next()方法读取下一行
next方法会在每次循环中调用,并且返回文件的下一行.
file = open("诗词歌赋","r+",encoding="utf-8")
for strindex in range(3):
line = file.__next__()
print("这是第%d行, ---%s"%(strindex,line))
file.close()
readline()方法
readline:从文件中读取整行,包括"\n",如果参数是>0的则会返回指定大小的字节数.
#readline
file = open("诗词歌赋","r+",encoding="utf8")
print(file.name)
print(file.readline())
print(file.readline(5))
file.close()
当read的参数<0的时候,基本就是无效的其作用和没有参数的效果一样
readlines
读取所有的行并将每一行作为一个元素带着换行符返回一个列表,
file = open("诗词歌赋","r+",encoding="utf8")
print(file.name)
print(file.readlines(1))
print(file.readlines())
file.close()
可以使用readlins遍历每一行
file = open("诗词歌赋","r+",encoding="utf8")
for line in file.readlines() :
print(line)
file.close()
截断文件方法
truncate()方法:如果参数大于零则表示截断文件为参数表示个数的字符后面字符清空,假如参数为空则从当前位置开始截断,后面的清空.
tuuncate带有参数
file = open("诗词歌赋","r+")
file.truncate(9)
file.close()
truncate不带参数
file = open("诗词歌赋","r+")
file.seek(9,0)
print(file.tell())
file.truncate()
file.close()
写入字符串序列
writelines:写入序列字符串
file = open("诗词歌赋","r+")
str_list = ["\nhello world","new lines"]
file.seek(0,2)
file.writelines(str_list)
print(file.read())
在这里终于找到seek方法第二个参数可以用的时候了,可能是前面操作的是中文,所以总是报错.(自己觉着这个解释有点牵强,继续寻找中文为什么就会出错的原因)
奇思妙想
在使用writelines方法的时候可不可以加入数字类型
file = open("诗词歌赋","r+")
str_list = ["\nhello world","new lines",2,3]
file.seek(0,2)
file.writelines(str_list)
print(file.read())
在这个异常可以看出来,writelines方法写入必须是字符串序列
但是序列是什么意思还很模糊,试一下字符串元组可不可行
file = open("诗词歌赋","r+")
str_list = ("\nhello world","new lines")
file.seek(0,2)
file.writelines(str_list)
print(file.read())