江湖道

庙堂,江湖,学术!

返回顶部

python 文件操作

1 文件操作的流程

1.打开文件,得到文件句柄并赋值给变量。

2.通过句柄对文件进行操作。

3.关闭文件。

1562755107068

2 从文件中读取数据:

文本文件存储的数据量多的难以置信:天气数据,交通数据,社会经济数据,文学作品等。当需要分析修改文件中的信息时,读取文件很是重要,对数据分析应用程序来说,尤其如此。例如,你可以编写这样一个程序:读取一个文本文件的内容,重新设置这些文件的格式并将写入文件,让浏览器能够显示这些内容。

要使用文件中的信息,首先需要将信息读取到内存中,为此,那你可以一次读取文件的所有内容,也可以每次逐行读取。

创建一个包含文件各行内容的列表

在使用with关键字时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件内容,可以再with代码块内将文件的各行存储在一个列表,并在with代码快外使用该列表:这样我们可以立即处理文件各个部分,也可以推迟到程序后面在处理。

下面的程序是将文件储存在列表中,在with代码块外打印它:

#Author:Anliu
with open("..\DIR_file\pi_digits",encoding=("utf-8")) as file_object:
    lines = file_object.readlines()
    print(lines)
for line in lines:
    print(line.rstrip())

2.1 读取整个文件

首先我们来创造一个文件:pi_digits

《再别康桥》
作者:徐志摩
轻轻的我走了,
正如我轻轻的来;
我轻轻的招手,作别西天的云彩。
那河畔的金柳,是夕阳中的新娘;
波光里的艳影,在我的心头荡漾。
软泥上的青荇,油油的在水底招摇;
在康河的柔波里,我甘心做一条水草!
那榆荫下的一潭,不是清泉,是天上虹揉碎在浮藻间,沉淀着彩虹似的梦。
寻梦?撑一支长篙,向青草更青处漫溯,满载一船星辉,在星辉斑斓里放歌。
但我不能放歌,悄悄是别离的笙箫;
夏虫也为我沉默,沉默是今晚的康桥。

下面的程序打开文件:

#Author:Anliu
with open("pi_digits",encoding=("utf-8")) as file_object:
    contents =file_object.read()
    print(contents)

以上程序打开文件,第一行代码,做了大量工作:open()函数接受一个参数,即要打开的文件名。python在当前当前所在目录中查找指定文件。open函数返回一个表示文件的对象。Python将这个对象存储在我们将在后面使用的变量中。

关键字with在不再需要访问文件后将其关闭。在这个过程中,我们发现我们调运了open(),但是没有调运close();想我们前面所述,调运open()以及close()函数来打开和关闭文件,这样做如果程序存在bug,导致了close()语句没有执行,文件则不会关闭。我们知道,文件未妥善关闭可能导致数据丢失或受损。如果是在程序过早的调运了close(),你会发现在使用文件时,他已经关闭而无法使用,这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过前面所示的结构,可以让python来决定,python会在适当的时候自动将其关闭。

上述程序执行结果如下:

《再别康桥》
作者:徐志摩
轻轻的我走了,
正如我轻轻的来;
我轻轻的招手,作别西天的云彩。
那河畔的金柳,是夕阳中的新娘;
波光里的艳影,在我的心头荡漾。
软泥上的青荇,油油的在水底招摇;
在康河的柔波里,我甘心做一条水草!
那榆荫下的一潭,不是清泉,是天上虹揉碎在浮藻间,沉淀着彩虹似的梦。
寻梦?撑一支长篙,向青草更青处漫溯,满载一船星辉,在星辉斑斓里放歌。
但我不能放歌,悄悄是别离的笙箫;
夏虫也为我沉默,沉默是今晚的康桥。

Process finished with exit code 0

为何输出文件会有一行空行?因为read()到达文件末尾时会返回一个空字符串,而将空字符创显示出来就是空行,删除末尾的空行用rstrip()处理。

#Author:Anliu
with open("pi_digits",encoding=("utf-8")) as file_object:
contents =file_object.read()
print(contents.rstrip())

实例:

1.遍历全文:

f = open("shige","r",encoding="utf-8")

for line in f.readlines():
print(line.strip())

f.close()

#Author:Anliu

data = open("shige",encoding="utf-8").read()

f = open("shige",encoding="utf-8") #文件句柄,(文件的内存对象)
data = f.read()
print(data)

f.close()

2. 读文件的前五行

f = open("shige","r",encoding="utf-8")
for i in range(5):
print(f.readline())
f.close()

3.第十行不打印

f = open("shige","r",encoding="utf-8")
for index,line in enumerate(f.readlines()):
if index == 9:
print("----------------分割线——————————————")
continue
print(line.strip())

2.2 文件路径

前面说过,open()打开文件时,是在当前目录下去查找需要被打开的文件。如果我们要打开的文件和程序文件不再同一个目录下,改怎么办?

这就需要制定文件路径,例如:

1562813295226

2.3 逐行读取

2.1节所述的readlines读取文件,是先把文件读到内存中,然后在做处理,但是如果是大文件,这样显然会有问题,为了解决这样的问题,我们需要将文件逐行读取。

例如:

#Author:Anliu
with open("..\DIR_file\pi_digits",encoding=("utf-8")) as file_object:
for line in file_object:
print(line.rstrip())

大文件读取

f = open("shige","r",encoding="utf-8")
count = 0
for line in f:
if count == 9:
print("-----------------分割线---------------")
count += 1
continue
print(line)
count += 1

文件读取的原理,文件读取本质上是文件指针的移动:

f = open("shige","r",encoding="utf-8")
print(f.tell())

print(f.read(5)) #读了多上个字符

print(f.tell())

print(f.readline())
print(f.readline())
print(f.readline())
f.seek(0)
print(f.readline())

3 写入文件:

保存数据最简单的方式就是将其保存到文件中。通过输出写入文件,即便是关闭包含程序输出的终端窗口,这些输出也依然存在,还可以编写程序来将这些输出读取到内存中并进行处理。

3.1 写入空文件

要将文本写入文件,你在调运open()时需要提供一个参数,告诉python你要写入打开的文件了。

看一下实例:

#Author:Anliu
f = open("shige1",'w',encoding="utf-8") #文件句柄,(文件的内存对象);模式为新建一个文件。
f.write("戈尔泰,大哥\n")
f.write("我爱北京天安门\n")
f.write("天安门上太阳升\n")

f.close()

在这个实例中,调运open时提供了三个参数,其他两个不用说,主要第二个参数,“w”告诉pyhon,我们要以写入的方式打开该文件,

打开文件时,可指定读取模式“r”,写模式“w”,附加模式“a”,或者让你能够读取和写入的文件模式“r+”,python默认为只读。

如果你写的文件不存在,函数open将自动创建它。然而,已写入的模式打开文件时千万写小心,因为如果指定的文件已存在,则将会在返回文件对象前清空该文件。

文件的读写

一下只能写在文件的最后。

f = open("shige","r+",encoding="utf-8")
print(f.readline())
print(f.readline())
print(f.readline())
f.write("-------------------—————diaobi———————————————")

文件写读:

先创建新文件,在写入:

f = open("shige","w+",encoding="utf-8")
f.write("diao___\n")
f.write("diao___\n")
f.write("diao___\n")
f.write("diao___\n")
print(f.tell())
f.seek(10)
print(f.readline())
f.write("wo ai beijing tanan meng ")
f.close()

但是文件内容还是写到了最后。

除此以外,还存在追加读写和二进制读写

f = open("shige","a+",encoding="utf-8") #文件句柄,追加读写

f = open("shige","wb") #文件句柄,二进制文件
f.write("hello binary\n".encode())
f.close()

3.2 追加文件

#Author:Anliu
f = open("shige1",'a',encoding="utf-8") #文件句柄,(文件的内存对象);a = append表示追加,也不具有读操作功能
f.write("戈尔泰,大哥\n")
f.write("我爱北京天安门\n")
f.write("天安门上太阳升\n")

f.close()

3.3 文件的强制持久化

f = open("anliutest.py","w")
>>> f.write("hello\n")
>>> f.flush()

例如:在我们安装软件的时候,出现的进度条,实际上就是这种持续刷新的过程。

#!/bin/python
import sys,time

for i in range(20):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)

3.4 文件截断

Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。

指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。

该方法没有返回值。

f = open("shige","a",encoding="utf-8")
f.truncate(20)

4 修改文件

(1)将文件加载到内存中,在内存中修改

(2)打开一个新文件,在新文件中修改

for line in f:
if "ip_addr" in line:
line = line.replace("ip_addr","192.168.42.111")
f_new.write(line)
f.close()
f_new.close()

这样循环即可修改文件。


5 文件操作总结

(1) seek(offset,where): where=0从起始位置移动,1从当前位置移动,2从结束位置移动。seek()无返回值,故值为None。注意:where=1,2只能用在二进制打开的文件中。

(2)tell(): 文件的当前位置,即tell是获得文件指针位置,受seek、readline、read、readlines影响。

(3)truncate(n): 有参数n的时候,从文件的首行首字符开始截断,截断文件为n个字符;无n表示从当前位置起截断;截断之后n后面的所有字符被删除。

(4)readline(n):读入若干行,n表示读入的最长字节数。其中读取的开始位置为tell()+1。当n为空时,默认只读当前行的内容

(5)readlines读入所有行内容

(6)read读入所有行内容

(7)几种文件打开方式对比

r只读,r+读写,不创建

w新建只写,w+新建读写,二者都会将文件内容清空。(以w方式打开,不能读出。w+可读写)

w+与r+区别:r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建。

以a,a+的方式打开文件,附加方式打开(a:附加写方式打开,不可读;a+: 附加读写方式打开)

posted @ 2020-03-31 12:08  大江东流水  阅读(319)  评论(0编辑  收藏  举报