(内容包括读写文件、读写excel、import操作等)
1 读写文件
1.1 I/O
I/O指的是Input/Output,也叫做输入输出流。Input Stream是数据从外部读进内存的输入流Output Stream是数据从内存向外部流出的输出流。 所谓流,就是数据在程序和外部设备间的单向管道,流的各种方法就是管道上的各种按钮。因为外设和内存存在运行时的速度差,可以根据是否等待IO的执行结果分为同步IO(等待),和异步IO(不等待)。异步IO性能更高,但编写更复杂,涉及到回调、轮询等。
1.2 文件读写
文件读写是最常见的IO操作。在磁盘上读写文件的功能都是由操作系统提供,操作系统不允许普通的程序直接操作磁盘,所以我们需要请求操作系统打开一个文件对象,通过操作系统提供的接口从文件对象中读取数据,或把数据写进文件对象中。
函数简介
[声明:此处使用的file,f不是关键字,就是被open()函数赋值的一个对象]
1.1.1 open函数
简单来说,可以把open函数理解为只有一个参数(文件名)必须输入的函数,用于打开一个文件。其他常用的参数是mode和buffering,分别表示打开模式和缓冲区。
open(file,mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
关于mode参数,需要传入一个字符串,来决定open函数打开方式(读/写)和磁头位置(从哪里开始修改)。

具体说一说:
- buffering是设置缓冲区大小,因为缓冲区在内存内改变高低电平即可改变值,而直接写入硬盘是磁信号,效率低下,建议使用默认值。buffering=None表示默认值,也就是系统自动使用4KB(即4096)或8KB(即8196)做缓冲区,缓冲区满了就加入磁盘。buffering=0只对二进制模式有用,表示直接改变硬盘数据。buffering=1只对文本文件有用,表示按行修改,但是如果操作大小超过一个默认缓冲区大小,也会进行flush ()操作(即写入磁盘),注意:是碰到换行符把含有换行符的整个数据写入磁盘,不是把换行符前的数据写入。 buffering>1时,建议采用大于4096的512的倍数,只对二进制模式有效。
- encoding表示编码,只对文本模式有效,建议用utf8。Windows才用gbk编码,Linux Unix Mac等采用utf8编码。如果是英文,没有任何问题,如果是中文,希望统一,不然会乱码。
- newline只对按行读写有效。具体作用是将数据按照换行符进行分割进一个数组中(类似于split()),如果是默认参数newline=None,系统就会把换行符全都改成系统默认换行符(Windows是\r\n,Linux是\n,Mac是\r)。newline=''时,上述三种换行符都会认作换行,但不会改成系统换行符,newline='\r\n'或'\n'或'\r'时,则只会按照指定的这种换行符对readlines产生的列表进行分隔。
- closefd参数:指的是文件描述符(0表示stdin标准输入,1表示stdout标准输出,2表示stderror标准错误输出)。默认值closefd=True,关闭文件的时候交还文件描述符。可以用file.fileno()来查看当前的文件描述符序号
open函数的属性
定义的打开文件对象有一些属性,如f.name, f.closed, f.mode,f.encoding
打开文件以后,一定要注意关闭close()
磁头位置:可以对磁头位置进行查看和设定
- file.tell() 表示对磁头位置进行查看,在第几个字符处。
- file.seek(offset,whence=0) 表示设定磁头的位置在第offset个字符处(偏移量),whence表示从哪里数起(初始位置),默认值0表示当前位置,1表示文件开头,2表示文件结尾。 这里需要说明的是,根据open模式的不同,seek(0)也是不同的。举个例子,如果是"r+"或"w+"模式打开,seek(0)的位置在原文档的开头;如果"a+"模式打开,那seek(0)的位置在原文档的结尾。
1.1.2 close函数
因为被打开的文件是不会自动关闭的,如果文件运行中,想要保存并关闭,可以:
- ①手动关闭f.close()
- ②try…except…finally:f.close()
- ③with open() as f:……
推荐直接使用第三种,以免还要自己写close
1.1.3 read函数
前提条件:不是以只写或只追加写的方式将文件打开。有三个函数可以对open()后的open对象进行读取,分别是read()、readline()和readlines()。read将文件一次性读完,是一个字符串类型的对象;readline表示每次只读一行下次调用读取下一行;readlines表示一次读完,并按每一行存放在一个列表中,列表下标0~n-1表示第x行。
1.1.3.1 read()
可以对open对象file使用read()方法,来读取open对象中的信息,read函数的用法很简单,file.read(size=-1),默认参数size表示读取的字符数量,如果是负数,则全部读取。
1.1.3.2 readline()
使用file.readline()是读取一行,下一次用是读取下一行,如果到了结尾就返回空字符串 。但是请记得,如果同一行涉及到两个操作,建议用中间变量去完成,不然你的第1个操作用的是file.readline(),你下一个file.readline()读取到的就是下一行了,就不是第一个操作的本文了。另外,如果用循环做遍历,用''符号去判断是否读取结束,不要用None。
1.1.3.3 readlines()
如果要按行读取,建议用readlines而不是readline。readlines会把open对象按行分割,保存在一个列表中。你想取第i行,就是a[i-1]即可。
1.1.4 write函数
前提:open的模式非只读模式(r,rt,rb等),可以进行写操作。
可以对open对象file使用write()方法,来对open对象中的信息进行修改。使用file.write('xxxxx')方法可以在定义好的磁头位置(r+ a w seek()等)写入xxxxx字符。
另外,利用file.writelines(list)可以将列表中的元素一次性写进file对象中,但是列表中元素和元素是没有分隔符的。如果想要每个元素换行,用file.writelines([i+'\n' for i in a])。
请注意你的磁头位置,write()或writelines()操作之后,磁头位置在write()写入的最后一个字符之后,之后的操作会在磁头位置开始进行。
1.2 其他file方法
file.flush() 这个方法可以将内部缓冲区的数据立即写入文件,从而刷新文件内部缓冲。
file.fileno()返回当前文件的文件描述符
file.isatty() 判断文件是否连接到一个终端设备,是返回True,否返回False
file.truncate(size) 删除size个字符的文件,如果没有参数,全部删除
1.3 os模块
os库是Python标准库,包含几百个函数,常用路径操作、进程管理、环境参数等几类。os.path子库以path为入口,用于操作和处理文件路径。可以和Linux中的Shell命令做一个简单的对比。
下面介绍一些实用的方法:
- os.name 这个属性是判断正在使用的平台,Windows返回'nt', Linux返回'posix'
- os.getcwd() 返回python程序正在工作的目录(目录可以理解为文件夹)
- os.listdir() 列出当前目录(即os.getcwd())下所有的文件和目录名
- os.mkdir('folder') 在当前目录下新建一个名为folder的文件夹(目录)
- os.rmdir("folder") 删除当前路径下的指定目录(文件夹)
- os.remove('filename') 删除当前路径下的指定文件名(如果有后缀名要加后缀名)
- os.rename(oldname, newname) 重命名文件
- os.chdir(path) 修改当前程序操作的路径为path。 path的格式如:'D:\Codes\PythonCodes\Folder1' (Windows用反斜杠\,Linux用斜杠/)
- os.getlogin() 返回当前系统登录的用户名
- os.cpu_count() 返回此电脑CPU的核数
- os.urandom(n) 返回n个字符的随机字符串
- os.walk(top,topdown=True,onerror=None,followlinks=False) 对top路径下的所有文件进行遍历,返回三个参数root(遍历到的路径)、dirs(遍历到这个root中的文件夹名字组成的列表)、files(遍历到的这个root中的文件的名字)。os.walk需要循环执行,用for root,dirs,files in os.walk(top): 来进行遍历。 其中的参数topdown=True表示从top开始按名字顺序一个一个访问,如果有文件夹(目录),下次循环就接着进入下一层访问,直至什么都没有。topdown=False表示从文件(以及文件中包含的文件)总数最少的目录开始循环,按照文件及目录及更下层中的文件和目录的总个数由少到多进行访问。followlinks=False或True是选择是否访问快捷方式所跳转到的新目录中。
1.4 os.path模块
os.path 模块是os的子模块,可以使用import os.path语句进行导入(import一般不能加.来连接更子级的模块,但这个可以),主要用于获取文件的属性。
提供一些os.path的常用方法:
- os.path.basename(‘path/filename’) 去掉目录路径,返回文件名
- os.path.dirname(‘path/filename’) 去掉文件名,返回目录路径
- os.path.join(path1[,path2[,...]]) 将分离的各部分组合成一个路径名
- os.path.split('path') 返回( dirname(), basename())元组
- os.path.splitext() 返回 (filename, extension) 元组
- os.path.getatime\ctime\mtime 分别返回最近访问、创建、修改时间
- os.path.getsize() 返回文件大小
- os.path.exists() 是否存在
- os.path.isabs() 是否为绝对路径
- os.path.isdir() 是否为目录
- os.path.isfile() 是否为文件
1.5 sys模块
Python的sys模块提供访问解释器使用或维护的变量,和与解释器进行交互的函数。通俗来讲,sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python运行时的环境。
下面列举一些sys库中的常用方法:
- sys.argv 命令行参数List,第一个元素是程序本身路径
- sys.modules.keys() 返回所有已经导入的模块列表
- sys.exc_info() 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
- sys.exit(n) 退出程序,正常退出时exit(0)
- sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0
- sys.version 获取Python解释程序的版本信息
- sys.maxint 最大的Int值
- sys.maxunicode 最大的Unicode值
- sys.modules 返回系统导入的模块字段,key是模块名,value是模块
- sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
- sys.platform 返回操作系统平台名称
- sys.stdout 标准输出
- sys.stdin 标准输入
- sys.stderr 错误输出
- sys.exc_clear() 用来清除当前线程所出现的当前的或最近的错误信息
- sys.exec_prefix 返回平台独立的python文件安装的位置
- sys.byteorder 本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'
- sys.copyright 记录python版权相关的东西
- sys.api_version 解释器的C的API版本
- sys.stdin,sys.stdout,sys.stderr stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足要求, 它们就是所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备(device), 或者以非标准的方式处理它们
2.导入模块import
用import可以导入第三方模块或内置模块,被导入的模块往往可以帮我们完成一些我们无法用简单的内置函数直接解决的问题,或提供一些我们日常常用的功能。例如math库中的math.pi就可以方便的给出圆周率的近似浮点数,math.ceil(floatnum)就可以将浮点数变成比他大的最小整数。
使用import语句可以将一些现成的库导入以供使用。首先说说怎样下载第三方库:
1.在cmd或者PowerShell中利用pip list查看已经有的第三方库
2.在cmd或者PowerShell中利用pip install第三方库 来安装新第三方库
3.如果遇到pip很慢的情况,用在pip install xxxxxxx的后面加上pip的目标地址清华大学 -i https://pypi.tuna.tsinghua.edu.cn/simple作为后缀,在国内的源下载
在安装完第三方库以后,我们就可以导入模块了。这里简单提供几种语句:
- 第一种
#这条语句主要用来导入一整个模块。
import sys
#被导入的模块要从模块名开始写,对要想使用的函数进行书写
sys.stdin.readline()
- 第二种
#这条语句主要用来导入一个模块的某一功能
from sys import stdin
#导入功能后,只需要从功能开始写即可
stdin.readline()
- 第三种
#这条语句用来给导入的模块取一个别名
import sys as A
#只需要用别名去取代原模块的名字即可
A.stdin.readline()
- 其它
#一次导入多个模块
import sys,time,os
#一次导入多个模块,并取别名
import sys as A, time as B,os as C
#导入模块中的所有函数(方便,但不建议使用)
#使用时只需要把模块中的成员函数或者成员变量直接用即可
#不推荐的原因是因为可能重名造成二义性re.split()和split()用法不同,但是调用时却用了同一个函数
from re import *
#导入模块中的某几项功能
from sys import argv, winver
#导入模块中的某几项功能,并给功能取别名
from sys import argv as A, winver as B
如果您觉得Tc写得不错或者不好,欢迎批评✖或点赞👍。
