本篇文章给大家谈谈learn python the hard way (笨办法学python),以及笨办法学python进阶版,希望对各位有所帮助,不要忘了收藏本站喔。
Source code download: 本文相关源码
“笨办法”学Python 3基础篇系列文章
“笨办法”学Python 3基础篇 第一部分-打印与输入
“笨办法“学Python 3基础篇 第二部分-文件操作
“笨办法“学Python 3基础篇 第三部分-函数
“笨办法”学Python 3基础篇 第四部分-数据容器与程序结构
“笨办法”学Python 3基础篇 第五部分-面向对象的类
“笨办法”学Python 3基础篇 第六部分-项目骨架与自动测试
“笨办法”学Python 3基础篇 第七部分-搭建简易的网站
第二部分 文件操作
引言
上一篇学习总结中,我们接触了简单的打印和输入命令。本篇将介绍通过引用import, 实现对文件进行基本读写操作的方法学c+还是python。
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
, greeting, somewhere = argv
print(f"{greeting} {somewhere}")
首先,Python从默认路径里的sys模块中引用了argv,脚本具备了获取命令行参数的能力,参数是以列表的数据格式返回给脚本。 第二行代码则是对获取的列表参数进行解包,将列表的第一个元素(通常为当前运行的脚本程序名)解包给变量,第二个元素解包给greeting变量,第三个元素解包给somewhere变量。第三行代码则是前文所介绍的格式化打印。
通过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!
基本步骤如下:
- import argv 获取hola.txt的文件名
- open 获得hola.txt的文件对象
- read 读取文档内容
- close 关闭文档,准备下次文档操作
from sys import argv
, 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
, 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
, 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!
步骤为:
- 获取hola.txt的文件名
- 打开hola.txt文件
- 第一次读取hola.txt文件
- 打印
- 重新设置文件读取指针到开头
- 第二次读取hola.txt文件
- 打印
- 关闭hola.txt文件
在这一流程中,第一次使用read()读取所有字节后,读指针处于文件尾部。此时使用seek函数重设读指针位置,实现复读功能。具体代码为:
from sys import argv
, 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中验证结果为:
2.2.4 编辑文档 - write 用法
通过上两节read和readline的用法,我们熟悉了如何打开文档、读取文档的数据、关闭文档。本节我们通过write函数来实现 “如何重新编辑文档”。
编辑文档的基本流程为:
- 获取文件名
- 用写模式打开文件对象( 自动清除文档中的内容)
- 输入要编辑的语句
- 写入文档
- 关闭文档
- 读取文档验证结果
- 关闭文档
为此,我们重新编辑hola.txt文档,将文档内容修改为:
Hello everyone!
代码为:
from sys import argv
, 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()
结果为:
2.3 copy文件 - open、read、write 综合用法
复制黏贴是最常用的文件操作方法。接下来,我们介绍如何综合使用前几节介绍的open、read、write函数实现将hola.txt中的内容复制到一个新建文件greet.txt中。
所需要的操作步骤:
- 获取hola.txt(源文件)和greet.txt(目标文件)文件名
- 打开hola.txt文件
- 读取hola.txt文件内容
- 写模式打开greet.txt
- 写入hola,txt的文档内容
- 关闭greet.txt文件
- 关闭hola.txt文件
值得注意的是,在第4步时,如果greet.txt不是一个已经存在的文件, 那么在打开时,Python会自动新建一个greet.txt。具体的Python代码如下:
from sys import argv
, 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函数中选择不同的读写模式实现。