day4-Python-文件I/O

一、打印到屏幕

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\n', '123456789\n', '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便便很可爱

  

  

 

posted @ 2019-04-19 21:25  无敌的便便  阅读(120)  评论(0编辑  收藏  举报