python 文件的读写

Posted 不自在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 文件的读写相关的知识,希望对你有一定的参考价值。

python对文件的操作通过open()函数来实现,文件操作有两种模式:读、写

一、读

通过对open()函数的mode参数传入"r"值可打开文件,然后使用读的方法读取文件内容,一般有开就有关,所以还需要用close()方法关闭文件,避免产生内存溢出的问题。另外,若读取的文件不存在,则会抛错。

例:读取当前目录下的test.txt文件,该文件如下所示。

代码实现:

f = open("./test.txt", "r")
print(f.read())
f.close()

执行结果:

从上图看出,读取的内容,中文显示乱码 ,可以在读取文件时增加参数encoding=“utf-8”解决该问题 

f = open("./test.txt", "r", encoding="utf-8")
print(f.read())
f.close()

执行结果:

读的方法

上面例子中使用了read()方法读取文件,除此之外,还有readline()和readlines()这两种方法。下面依次讲解每种读法的不同之处。

read()

该方法是读文件最常用的方法,特点是,使用该方法默认情况下是将文件中的所有内容一次性全部读取出来,比如上面的示例,但是也可以读取指定字节的内容。

f = open("./test.txt", "r", encoding="utf-8")
# 只读取前面5个字节
print(f.read(5))
f.close()

执行结果:

readline()

该方法是将文件内容一行一行读取,特点是,执行一次读取一行,如果要读取完文件,就要执行多次。

f = open("./test.txt", "r", encoding="utf-8")
i = 1
while True:
    content = f.readline()
    if not content:
        break
    print(f"第{i}次读:{content}")
    i += 1
f.close()

执行结果:

readlines()

该方法也是将文件内容一行一行读取,特点是,一次性读取所有内容,并将每行的数据保存在一个列表。

f = open("./test.txt", "r", encoding="utf-8")
print(f.readlines())
f.close()

执行结果:

处理换行符\\n

使用 readlines() 方法读取的内容会有换行符\\n,极不方便我们对数据的处理。处理换行符的方法多种多样,下面介绍一种最简单的方法,使用字符串的内置方法 splitlines() ,该方法是将字符串以\\n为分隔符进行切割。

t = "AAAA\\nBBB\\nCCC"
print(t.splitlines())

f = open("./test.txt", "r", encoding="utf-8")
print(f.read().splitlines())
f.close()

输出结果

 综上,python读取文件的操作最常用的方法只需要记住read()方法就可以了。

二、写

与读方法类似,不同的是mode参数传入的值不同,需要传入“w”或”a“ 看到这里,有些读者可能会想,写为什么可传入两种写模式?因为读的操作只有一种场景,但写的场景却有覆盖写和追加写两种场景。

1、覆盖写:w

覆盖写的特点

  • 会清空原文件内容
  • 当文件不存在时,会新增文件

如下,写入‘你好,世界!’时,将原来的内容都清空。

f = open("test.txt", "w")
f.write("你好,世界!")
f.flush()
f.close()

执行代码后的文件内容如下:

f.flush():有时我们用f.write()后,会发现没有写入文件,这是因为内容存在了缓冲区,需要等缓冲区满了之后,再把所有数据写入。此时可以用f.flush()强制把缓冲区里面的数据写到磁盘上。

2、追加写: a

追加模式a特点:

  • 即在原内容末尾添加新内容
  • 当文件不存在时,创建新文件
f = open("test.txt", "a")
f.write("你好,python!")
f.flush()
f.close()

将‘你好,python’添加到原内容的末尾

除了以上r,w,a三种模式外,还有一种读写模式,在上面三种中模式中,任意一种模式后面增加+即为读写模式,读写模式很少用,仅供了解,下表为各种模式的总结:

读写模式 是否可读 是否可写 文件不存在时
r 报错
r+ 是,覆盖写 报错
w 是,覆盖写 创建新文件
w+ 是,覆盖写 创建新文件
a 是,追加写 创建新文件
a+ 是,追加写 创建新文件

三、文件指针

文件指针用来记录文件走到哪里。

文件指针是很重要的,我们看下面的例子中,read将test.txt的内容全部读了出来,readline则没有读出任何内容。原因是read读完之后,文件指针到了文件的末尾,此时readline接着从这个位置开始读,肯定是没内容的。因此有时需要调整文件指针的位置。  

f = open("test.txt")
print("read读的:", f.read())   # 已经读到最后一行
print("readline读的:", f.readline())  # 指针连着上一个操作,从最后一行读,所以没内容
f.close()

输出结果:

read读的: 你好,世界!
你好,pathon!
readline读的: 

seek可以移动文件指针,移动后只是针对读,用追加模式写的时候,还是在末尾写。

另外,seek(num),这个num指的是字符,不是行。注:中文占两个字符!

在上面的代码中,加一句f.seek(0),即可将指针移到文件开头。这次,readline就可以从头开始读了。

f = open("test.txt")
print("read读的:", f.read())   # 已经读到最后一行
f.seek(2)   # 中文占两个字符,若输入1则会报错
print("readline读的:", f.readline())  # 指针连着上一个操作,从最后一行读,所以没内容
f.close()

输出结果:

read读的: 你好,世界!
你好,pathon!
readline读的: 好,世界!

四、使用with打开文件

with 语句是 Pyhton 提供的一种简化语法,通过 with 语句在编写代码时,会使代码变得更加简洁,不用再去关闭文件。

with open(\'test.txt\', \'a\', encoding="utf-8") as f:
    f.writelines(\'\\n三体\')

上面的代码等效于

f = open("./test.txt", "w+", encoding="utf-8")
f.write("aaa")
f.close()

五、文件修改

1、简单粗暴直接修改

最简单粗暴的修改文件,步骤是:

(1)打开文件,获取文件内容;

(2)对内容进行修改;

(3)清空原来文件的内容;

(4)把新的内容写进去。

这种方法很简单,下面看一个小例子----文件username里存放了姓名和密码,如下图格式。我们要在所有姓名前加上‘A班_’

因为\'A班_\'中含有中文,需要叫上encoding=\'utf-8\',否则会出现乱码。

   

2、备份文件的方法

当文件很大时,刚刚的方法在一次性读取文件内容和写入新内容时,耗时长,占用磁盘空间也较大。

备份文件的方法是建立一个备份文件,读一点,改一点,写一点,具体步骤如下:

(1)打开2个文件,原文件a和备份文件b。如a.txt    b.txt.bak

(2)删除a文件,将b文件名改为a文件名

例:将文件words里的“花”改成“flower”

以上是关于python 文件的读写的主要内容,如果未能解决你的问题,请参考以下文章

python读写文件

Python代码中打开txt文件(非读写)

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

python常用代码片段总结

常用python日期日志获取内容循环的代码片段

Python文件读写