Python中的文件读写

文件基础知识

        计算机有两种存储设备-内存储器和外存储器,虽然它们都是用来保存数据的,但无论外形还是特点都差别巨大。我们常见的硬盘属于外存储 器,而内存条就属于内存储器。

(内存条)内存储器 VS (硬盘)外存储器

存取速度快              VS 存取速度慢

容量小                     VS   容量大

成本高                    VS  成本低

文件的概念:

        文件是磁盘上的一个指定位置,用来存储相关信息。它用于永久地将数据存储在非易失性的内存中(如:硬盘、U 盘、移动硬盘、光盘等)。将数据长期保存成文件,在需要的时候使用。

文件(File)大致分为文本文件和二进制文件两个大类。

        一般来说,直接用记事本程序打开文件,如果里面是可读的文字就是文本文件,如果是一堆不知所云的乱码就是二进制文件。

(1)文本文件可以用文字处理软件建立和修改,以纯文本文件保存。

(2)二进制文件(Binary File):以二进制方式保存的文件。该文件不能用普通的编辑软件进行查看,存储空间占用小。

打开文件

        使用Python内置函数open()可以打开指定的文件,用于对文件进行读取,修改或添加内容。open()函数的语法如下所示。

open(filename[,mode][,encoding])

        open()函数公有8个参数,其中最常用的有3个,分别是filename(文件名称)、mode(文件打开模式)和encode(文件编码方式)。

        其中filename是不可以省略的,其他参数都可以省略,省略时会使用默认值。默认方式打开文件Open()函数默认以只读方式打开文件,并且返回文件对象。打开文件代码如下所示。

例:

 # 文件基本操作(open())
# 打开当前目录中的文件
file1 = open("myfile.txt") 
file1.close()
# 指定完整路径file2 = open("D:\Programs\Python\Python37-32\myfile.txt") 
file2.close()

使用打开模式

        打开文件时如果不指定模式,那么默认为'r',以只读方式打开文件。此外,还可以显式指定打开模式 读取使用'r'、写入使用'w'、追加使用'a'。还可以指定以文本模式或二进制模式打开文件(处理非文本文件(例如:图像、exe)时使用)。打开文件使用打开模式的例子如下所示。

例:

# 文件基本操作(打开模式)
# 相当于'r'或'rt'
file1 = open("myfile.txt")
print("文件打开模式:",file1.mode)
file1.close()
# 以文本模式写入file2 = open("myfile.txt", 'w')
file2.close()
# 以二进制模式读写file3 = open("logo.jpg", 'r+b') 
file3.close()

r:只读模式:

只读不可写

w:只写模式

只可写不可读,打开时自动清空原本的内容

a:追加模式

只写,不可读,打开时光标自动定在末尾,文档内容不会清空

r+:读写模式先读后写。

        打开文档时不清空原内容,光标定位正在开始位置。读完后光标会移到文档末尾,所以写的时候是追加在文档最后的。不会覆盖原内容。如果以“r+”模式打开,但是先写后读,那么写入的内容会覆盖原内容,读取时从写结束位置开始读。如果原文档内容小于新写入的,那么全部被覆盖,读到的为空。如果原文档内容大于新写入的,那么读到的内容为原文档剩下的内容。

w+:写读模式先写后读。

        打开文档即清空原内容,从文档开头写起,写完后光标自动移到文档末尾,此时进行读取,内容为空。需要将光标移到首位,f.seek(0)。如果以“w+”模式打开,先进行读操作,读到的内容也是为空,因为打开即被清空了。

a+:追加写读模式先写后读。

        追加在原文档末尾,不会清空原内容,写完后光标移到文档末尾,此时进行读取,内容为空。需要将光标移到首位,f.seek(0)。如果以“a+”模式打开,先进行读操作,读到的内容也是为空,因为打开即把光标定位在文档末尾。

        文件默认的编码依赖于平台。在Windows系统中,默认编码为“cp936”;在Linux系统中,默认编码为“UTF-8”。可以看到,不同平台上的默认编码是不一样的。所以如果依赖于默认编码,那么代码在不同平台上将会有不同表现。因此,当以文本模式处理文件时,强烈建议指定编码类型。使用文件编码的例子如下所示。

例:

# 文件默认编码
file1 = open("myfile.txt")
print("文件编码:",file1.encoding)file1.close()
# 打开文件时指定编码类型
file2 = open("myfile.txt",mode = 'r',encoding = 'utf-8')
file2.close()

关闭文件(close())

        当完成对文件的操作时,需要适当地关闭,以释放与该文件绑定的资源,可以使用close()函数关闭文件。可以采取常规关闭方式、异常处理关闭方式和使用with语句关闭方式来关闭文件。(1)常规方式

        使用close()方法来完成文件关闭工作,使用这种方式并不完全安全,因为在对文件执行某些操作时很有可能会引发IOError。一旦出错,代码将会退出而无法执行关闭文件的代码。

(2)异常处理

        更安全的方式是使用try...finally块,这样,即使出现异常,也可以确保文件能够被正确地关闭。

(3)使用with语句

        每次都要采用异常处理的try...finally来关闭文件,这样做代码有些繁琐。所以,Python 引入了with语句,这可以确保当with中的块退出时,文件被安全地关闭,该动作是在内部完成的。这样和try ... finally的效果是一样的,而且无需显式地调用close()。

# (1)常规方式
print("(1)常规方式。")
file1 = open("myfile.txt")
file1.close()
# (2)异常处理
print("(2)异常处理。")
try: 
    file2 = open("myfile.txt")
# 文件相关操作
finally: 
    file2.close()
# (3)使用with语句
print("(3)使用with语句。")
with open("myfile.txt") as file3:
# 文件相关操作,不用显示调用
close()pass

文件读写操作

        文件读就是从文件中读出数据到内存中去;

        文件写就是把内存中的数据写入文件中。

文件读操作:

        Python的文本文件的内容读取,必须以读'r'模式打开文件,常用的有三种方法:read()、readline()、readlines()。

(1)read()

        read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即存在内存中。read()函数可以传递参数来指定读取文件指定编码(encoding)的字符数,如果没有传递参数则表明读取并返回到文件尾部。

例:

# 文件基本操作(读文件read())

# 文件内容:“我们都喜欢Python。”

with open("myfile.txt",mode='r',encoding='utf-8') as file: 
    print(file.read(2)) 
    print(file.read(1))
    print(file.read(2))
    print(file.read(6)) 
    print(file.read(1))

(2)readline()

        readline()逐行读取文本,结果是一个list。readline()采取逐行读取,所以占用内存少,同时速度比较慢。使用readline()读取文件的例子如下所示。

例:

# 文件基本操作(读文件readline())
# 文件内容:
# “我们都喜欢Python。”
# “我们一起学习Python。”
with open("myfile.txt",mode='r',encoding='utf-8') as file: 
    line = file.readline() 
    while line:
        line =line.rstrip('\n')
        print(line)
        line = file.readline()

3)readlines()

        readlines()一次性读取文本的所有内容,结果是一个list。readlines()读取的文件内容,每行末尾都会带一个“\n”换行符(可以使用list.tstrip(‘\n’)去掉换行符)。readlines()一次性读取文本内容,速度比较快,但readlines()随着文本的增大,占用内存会越来越多。

例:

# 文件基本操作(读文件readlines())
# 文件内容:
# “我们都喜欢Python。”
# “让我们一起学习Python。”
with open("myfile.txt",mode='r',encoding='utf-8') as file: 
    for line in file.readlines():
        line_print =line.rstrip('\n')
        print(line_print)

文件写操作:

        为了写入文件,需要以写'w'模式打开,追加则使用'a'或独占创建使用'x'。在使用'w'模式时需要小心,因为如果文件存在,则会进行覆盖,以前的所有数据都将被清除。如果要向文件追加内容,使用模式'a'。Python的文件写操作常用的方法有wirte()和writelines()。

(1)wirte()

        wirte()把参数内容写到文件中,wirte()并不会在字符串后加上一个换行符。wirte()进行文件操作的例子如下所示。

例:# 文件基本操作(写文件write())# 写操作

with open("mynewfile.txt",mode='w',encoding='utf-8') as file: 
    file.write("We all like Python.")
    # 换行file.write("\n")  
    file.write("Let's study Python together.")
    # 换行 file.write("\n") 
    # 读操作
    with open("mynewfile.txt",mode='r',encoding='utf-8') as file: 
        for line in file.readlines():l
            ine_print =line.rstrip('\n')
            print(line_print)

(2)writelines()

        writelines()把多行内容写到文件中,参数可以是一个可迭代的对象、列表、元组等。使用writelines()进行写文件操作的例子如下所示。

例9-9:程序代码:

# 文件基本操作(写文件writelines())
# 写操作
list = ("我们都喜欢Python。","\n","让我们一起学习Python。","\n")
with open("mynewfile.txt",mode='a',encoding='utf-8') as file:  
    file.writelines(list)
# 读操作
with open("mynewfile.txt",mode='r',encoding='utf-8') as file:
    for line in file.readlines(): 
        line_print =line.rstrip('\n') 
        print(line_print)

文件目录操作

        在Python 中,有一个os模块,也提供了许多便利的方法来管理文件和目录。

        Os提供了创建目录、删除目录、删除文件、执行操作系统命令等方法,使用时必须导入os包。

1. remove()方法

        remove()方法用于删除指定文件,一般都会结合os.path的exists()方法使用,即先检查该文件是否存在,再决定是否删除该文件。删除文件的例子如下所示。

例:

# 文件与目录操作(remove()方法)
import os
file_name = "mynewfile.txt"
if os.path.exists(file_name): 
    os.remove(file_name) 
    print(file_name + "文件删除成功!")
else: 
    print(file_name + "文件未找到!")

2.mkdir()方法

        用mkdir()方法可以创建指定名称的目录。执行后会在当前目录创建对应的目录。但如果目录已经创建,执行时就会产生错误。所以一般要先检查该目录是否存在,再决定是否要创建该目录。例:

# 文件与目录操作(mkdir()方法)
import os
my_dir = "PythonDir"
if notos.path.exists(my_dir): 
    os.mkdir(my_dir) 
    print(my_dir + "目录创建成功!")
else: 
    print(my_dir + "目录已经存在!")

3.rmdir()方法

        rmdir()方法可以删除指定目录,删除目录前必须先删除该目录中的文件。一般都会先检查目录是否存在,再决定是否要删除该目录。删除目录的例子如下所示。

例:

# 文件与目录操作(rmdir()方法)
import os
my_dir = "PythonDir"
if os.path.exists(my_dir): 
    os.rmdir(my_dir) 
    print(my_dir + "目录删除成功!")
else: 
    print(my_dir + "目录不存在!")

递归删除文件夹:

import shutil
shutil.rmtree('PythonDir')

4. system()

        方法system()方法用来执行操作系统命令,例如:清除屏幕、创建“PythonDir”目录,复制myfile.txt文件到新建目录下,并更名为mynewfile.txt,最后用记事本打开该文件。具体代码如下所示。

例# 文件与目录操作(system()方法)

import os
# 获取当前路径
current_path =os.path.dirname(__file__)
# 清除屏幕
os.system("cls")
# 创建PythonDir目录
os.system("mkdir PythonDir")
# 复制文件
os.system("copy myfile.txt PythonDir\mynewfile.txt")
# 使用记事本打开mynewfile.txt文件
file_name =current_path + "\PythonDir\mynewfile.txt"
os.system("notepad " +file_name)

os.walk()方法

        os.walk()用来搜索指定目录及其子目录,它会返回一个包含3个元素的元组(dirpath, dirnames, filenames):

dirpath:以字符串形式返回该目录下所有的绝对路径

dirnames:以列表形式返回每一个绝对路径下的目录

filesnames:以列表形式返回该路径下所有文件遍历目录的

例子如下所示:

import os
# 获取当前路径
current_path =os.path.dirname(__file__)
sample_tree =os.walk(current_path)
for dir_name,sub_dir,files in sample_tree: 
    print("文件路径:",dir_name) 
    print("目录列表:",sub_dir) 
    print("文件列表:",files) print()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值