一、打印到屏幕
Python两种输出值的方式: 表达式语句和 print() 函数
1、print语句,可以给它传递零或多个用逗号隔开的表达式。
此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出。
>>> print("我很漂亮,","yes?") 我很漂亮, yes?
2、str(): 函数返回一个用户易读的表达形式。repr(): 产生一个解释器易读的表达形式。
>>> a='hello,world!' >>> str(a) 'hello,world!' >>> repr(a) "'hello,world!'" >>> str(1/3) '0.3333333333333333'
二、读取键盘输入
input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
input 可以接收一个Python表达式作为输入,并将运算结果返回。
>>> str=input("请输入:") 请输入:bianbian >>> print(str) bianbian
三、文件操作
文件操作的流程:
- 打开文件,得到文件句柄赋值给一个变量
- 通过文件句柄,对文件进行操作
- 关闭文件
1、基本读取文件
open() 将会返回一个 file 对象,基本语法格式如下:
open(filename, mode)
- filename:包含了你要访问的文件名称的字符串值。
- mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
>>> f=open("/Users/bianbian/Desktop/cart.json","r") >>> data=f.read() >>> print(data) 我叫便便 my name is bianbian 123456789 abcdefg >>> f.close()
注: f 叫文件句柄,它包含文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置
>>> f=open("/Users/bianbian/Desktop/cart.json","r") >>> data=f.read() >>> data1=f.read() >>> print(data) 我叫便便 my name is bianbian 123456789 abcdefg >>> print(data1) #data2的数据为空 >>>
因为在文件中 ,维护一个类似文件指针的一个东西,这个文件指针类似于我们平时操作文件时的光标的东西,所以当第1次读文件时,文件指针已经指向最后一个位置,所以第2次再去读取的时候,是从最后一个位置开始读取的,所以读取的为空。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
2、高效读取文件行
readline() 读取一行文件
>>> f=open("/Users/bianbian/Desktop/cart.json","r") >>> print(f.readline()) 我叫便便
readlines()把文件中的每一行作为一个元素形成一个列表
>>> print(f.readlines()) ['my name is bianbian ', '123456789 ', 'abcdefg']
正常循环读取文件中的每一行
f=open("/Users/bianbian/Desktop/cart.json","r") for index,line in enumerate(f.readline()): if index == 2: #当下标值为2时,不打印 print("----------------") continue print(line.strip()) f.close() 我 叫 ---------------- 便
当读取的文件很大时,把几十个G的数据放到内存,内存肯定是受不了的,所以这种方法只适合小文件,不适合大文件。
f=open("/Users/bianbian/Desktop/cart.json","r") count=0 for line in f: if count == 3: print("----------------") count+=1 continue print(line.strip()) count+=1 f.close()
f文件变成迭代器,结果:
我叫便便 my name is bianbian 123456789 ---------------- 我叫便便 my name is bianbian 123456789 abcdefg我叫便便 my name is bianbian 123456789 abcdefg
读取文件时,是一行一行的读取,而且,读取一行删除一行,内存中只保留一行。原因:f文件变成迭代器,它已经不再是一个列表的形式了,不能通过下标值来获取,需要一个计数器来计数。
3、及时关闭文件
为了避免打开文件后忘记关闭,可以通过管理上下文的方法。当with代码块执行完毕时,内部会自动关闭并释放文件资源。
with open('log','r') as f:
Python 3 ,with又支持同时对多个文件的上下文进行管理
with open('log1') as obj1, open('log2') as obj2:
pass
上面打开多个文件会导致一行代码过长,python官方建议,一行代码不超过80个字符,所以打开多个文件建议以下写法:
with open('log1') as obj1, open('log2') as obj2: pass
4、文件修改
修改文件:先读文件,一边读操作,再一边写,也就是说写需要命令一个新的文件,编写成功后,把老的文件删掉,把新文件重新命名成老文件。
#读取老文件 f=open("/Users/bianbian/Desktop/cart.json",'r',encoding="utf-8") #写入新文件 f_new=open("/Users/bianbian/Desktop/cart_new.json",'w',encoding="utf-8") for line in f: #一边读老文件,修改内容 if "我叫便便" in line: line = line.replace("我叫便便","便便很可爱") # 一边在新文件中写入 f_new.write(line) f.close() f_new.close()
修改前的文件:
我叫便便
my name is bianbian
123456789
abcdefg
我叫便便
my name is bianbian
123456789
abcdefg我叫便便
my name is bianbian
123456789
abcdefg
修改后的文件:
便便很可爱
便便很可爱
abcdefg便便很可爱