“笨办法”学Python 3基础篇-文件操作

“笨办法”学Python 3基础篇系列文章

“笨办法”学Python 3基础篇 第一部分-打印与输入
“笨办法“学Python 3基础篇 第二部分-文件操作
“笨办法“学Python 3基础篇 第三部分-函数
“笨办法”学Python 3基础篇 第四部分-数据容器与程序结构
“笨办法”学Python 3基础篇 第五部分-面向对象的类
“笨办法”学Python 3基础篇 第六部分-项目骨架与自动测试
“笨办法”学Python 3基础篇 第七部分-搭建简易的网站



引言

上一篇学习总结中,我们接触了简单的打印和输入命令。本篇将介绍通过引用import, 实现对文件进行基本读写操作的方法。


2.1 获取文件名 - import argv 用法

在这里,终于接触到了所谓的引用(import)。不同于C++,Python通过import可以借用其他程序包(程序模块)中的部分功能,而避免了复制大段的代码,增加了灵活性、可调用性和共享性。一种更直白的理解可以想象新建的Python脚本是一张白纸,我们通过import从A处借来了白色的颜料,从B处借来了黄色的颜料,然后绘画出了自己的作品。至于A处的红色和B处的黄色颜料是怎么生产出来的和我们这幅画没有关系。
import argv 中argv代表了参数变量,可以保证你在命令行运行Python脚本时获得传递给Python脚本的参数。试想一下,如果需要你用Python 读取 help.txt这个文档,你该怎么让Python脚本知道要打开哪个文档呢?这时就需要用argv 获取读取的文档名。
具体我们来看一下如何使用import argv 获取脚本参数,实现打印
Hello World!

from sys import argv

script, greeting, somewhere = argv 

print(f"{greeting} {somewhere}") 

首先,Python从默认路径里的sys模块中引用了argv,脚本具备了获取命令行参数的能力,参数是以列表的数据格式返回给脚本。 第二行代码则是对获取的列表参数进行解包,将列表的第一个元素(通常为当前运行的脚本程序名)解包给script变量,第二个元素解包给greeting变量,第三个元素解包给somewhere变量。第三行代码则是前文所介绍的格式化打印。
PowerShell运行结果
通过PowerShell运行时,需要在Python命令后输入三个参数,即待运行的脚本文件名(csdn_argv.py), 第二个参数(Hello)和第三个参数(World!)。
这种输入方式与input()的用法区别在于:input()给脚本输入参数是在脚本运行后,而argv则是在脚本运行时同时传递参数。

2.2 打开文件 - open 用法

既然我们可以通过import argv 来获得需要查看的文档的文档名,并解包给脚本中自定义的变量,那么接下来要解决的问题就是:如何利用该变量读写文档内容?
要读写文档,首先得打开文档。实现文档打开功能需要Python3内置函数 open

open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode=‘r’)
完整的语法格式为:
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

open函数默认模式为只读,返回值为文件对象。因此,通过open函数可以得到待读取文件的对象,接下来就只需对该对象读操作即可。

2.2.1 读取文档 - read 用法

为了读取已经打开的文档内容,需要内置函数read

read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
语法为:fileObject.read([size]);
size – 从文件中读取的字节数,默认为 -1,表示读取整个文件。
返回从字符串中读取的字节。

根据read的语法,fileObject就是我们通过open函数返回的文件对象。这样,就可以通过import argv, open, read来实现文件内容的读取了。
我们以读取hola.txt文档为例,文档内容为:
Hello World!
Hello China!
基本步骤如下:

  1. import argv 获取hola.txt的文件名
  2. open 获得hola.txt的文件对象
  3. read 读取文档内容
  4. close 关闭文档,准备下次文档操作
from sys import argv

script, filename = argv
txt = open(filename)

print("first read:", txt.read(12))
print("second read:", txt.read(1))
print("third read:", txt.read())
txt.close()

代码第二行获取了文件的名,第三行用只读模式获得了文件对象,第四行代码则是读取了文件的前12个字节,第五行代码读取了文件的第13个字节换行符,第六行代码则是读取了文件的剩下所有字节数。最后一行代码调用了Python3内置函数close,实现文件的关闭。
文件读操作
从这个程序我们可以发现,连续读操作时,起始字节是从上一次读操作结束时的后一个字节开始的。因此,如果执行下面的读操作,则第二次对文件读操作时,将返回空字节。例如:

from sys import argv

script, filename = argv
txt = open(filename)

print("first read:", txt.read())
print("second read:", txt.read(12))
txt.close()

PowerShell中的运行效果为:
读空字符

2.2.2 读取文档 - readline 用法

如果想一次读写一行字符串,包括换行符,那么就需要用到readline这个函数。基本语法为:

fileObject.readline();
返回从字符串中读取的字节,默认为一行,当括号中有指定数字时,转化为从文件中读取多少字节,包括换行符。

因此,如果我们想读取hola.txt中的Hello World!, 代码可以修改为:

from sys import argv

script, filename = argv
txt = open(filename)

print(txt.readline())
txt.close()

2.2.3 任意位置读取 - seek 用法

通过上述两个例子,我们可以发现,读文件指针无法定位到任意位置,导致文档只能读取一遍,无法实现循环读取。解决这一问题的方法是使用seek函数,它的作用是移动文件读取指针到指定位置。基本语法为:

fileObject.seek(offset[, whence])
offset – 开始的偏移量,也就是代表需要偏移的字节数,如果是负数表示从倒数第几位开始;
whence – 可选,默认值为0。给offset定义一个参数,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾开始算起。
如果操作成功,返回新的文件位置,如果操作失败,则函数返回-1。

接下来,我们演示一下,如何循环读取hola.txt的内容:
Hello World!
Hello China!
Hello World!
Hello China!
步骤为:

  1. 获取hola.txt的文件名
  2. 打开hola.txt文件
  3. 第一次读取hola.txt文件
  4. 打印
  5. 重新设置文件读取指针到开头
  6. 第二次读取hola.txt文件
  7. 打印
  8. 关闭hola.txt文件

在这一流程中,第一次使用read()读取所有字节后,读指针处于文件尾部。此时使用seek函数重设读指针位置,实现复读功能。具体代码为:

from sys import argv

script, filename = argv
txt = open(filename)

first_data = txt.read()
print(f"first read: \n{first_data}")

txt.seek(0, 0)
second_data = txt.read()
print(f"second read: \n{second_data}")

txt.close()

在PowerShell中验证结果为:
seek用法

2.2.4 编辑文档 - write 用法

通过上两节read和readline的用法,我们熟悉了如何打开文档、读取文档的数据、关闭文档。本节我们通过write函数来实现 “如何重新编辑文档”
编辑文档的基本流程为:

  1. 获取文件名
  2. 用写模式打开文件对象( 自动清除文档中的内容
  3. 输入要编辑的语句
  4. 写入文档
  5. 关闭文档
  6. 读取文档验证结果
  7. 关闭文档

为此,我们重新编辑hola.txt文档,将文档内容修改为:
Hello everyone!
代码为:

from sys import argv

script, filename = argv
txt = open(filename, 'w')

newline = input(">: ")
txt.write(newline + "\n")
txt.close()

txt = open(filename)
print("The new hola.txt is: ", txt.read())
txt.close()

结果为:
write结果

2.3 copy文件 - open、read、write 综合用法

复制黏贴是最常用的文件操作方法。接下来,我们介绍如何综合使用前几节介绍的open、read、write函数实现将hola.txt中的内容复制到一个新建文件greet.txt中。
所需要的操作步骤:

  1. 获取hola.txt(源文件)和greet.txt(目标文件)文件名
  2. 打开hola.txt文件
  3. 读取hola.txt文件内容
  4. 写模式打开greet.txt
  5. 写入hola,txt的文档内容
  6. 关闭greet.txt文件
  7. 关闭hola.txt文件

值得注意的是,在第4步时,如果greet.txt不是一个已经存在的文件, 那么在打开时,Python会自动新建一个greet.txt。具体的Python代码如下:

from sys import argv

script, src_file, dir_file = argv

src = open(src_file)
data = src.read()

direct = open(dir_file, 'w')
direct.write(data)

direct.close()
src.close()

尽管在这个Python脚本中,我们没有使用print来打印结果。但可以在PowerShell中运行cat greet.txt来检查greet.txt的内容是否正确,如图
复制文件


小结

文件的操作还有很多用法,本文没有提及。主要原因是在本文所学书籍的练习中,这方面涉及的并不多。如果想进行更复杂的文件操作,可以在open函数中选择不同的读写模式实现。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书是一本Python入门书籍,适合对计算机了解不多,没有过编程,但对编程感兴趣的读者习使用。这本书以习题的方式引导读者一步一步习编程,从简单的打印一直讲到完整项目的实现,让初者从基础的编程技术入手,最终体验到软件开发的基本过程。 本书结构非常简单,共包括52个习题,其中26个覆盖了输入/输出、变量和函数三个主题,另外26个覆盖了一些比较高级的话题,如条件判断、循环、类和对象、代码测试及项目的实现等。每一章的格式基本相同,以代码习题开始,按照说明编写代码,运行并检查结果,然后再做附加练习。 Zed Shaw完善了这个堪称世上最好的Python习系统。只要跟着习,你就会和迄今为止数十万Zed教过的初者一样获得成功。 在这本书中,你将通过完成52个精心设计的习题来Python。阅读这些习题,把习题的代码精确地写出来(禁止复制和粘贴!),修正你的错误,观察程序的运行。在这个过程中,你将了解软件是如何工作的,好的程序看起来是什么样子,怎样阅读、编写、思考代码,以及如何用专业程序员的技巧来找出并修正错误。最重要的是,你将到下面这些编写优秀的Python软件必需的初始技能。 这本书会让你的每一分钟投入都有回报。Python是世界上最强大、最受欢迎的编程语言之一,很快你就会成为一名Python程序员。 你还可以看Zed的视频!随书附赠的DVD中包含5个多小时激情挥洒的教内容:一部完整的Python视频教程!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值