0%

第十二节:文件IO,私有属性和方法

自动摘要: title:第十二节:文件IO,私有属性和方法 tags: 课后解答 url:244.html id:244 categories: 学习 教学 date:2018 ……..

title: 第十二节:文件IO,私有属性和方法
tags:
- 课后解答
url: 244.html
id: 244
categories:
- 学习
- 教学
date: 2018-05-23 20:08:42

一;文件io

基本操作:

文件的存储方式

  • 计算机中,文件是以二进制的方式保存的
  • 文本文件就是可以使用文本编辑器查看,二进制文件无法使用文本编辑器查看,是提供给其他软件使用的,例如图片,音视频等

操作文件的套路

1、打开文件open

  • open函数负责打开文件, 并返回文件对象
  • 打开文件的方式有很多种,常用的如下:
    • r 只读,默认模式,如果文件不存在,抛出异常
    • w 只写,如果文件存在,则覆盖,不存在,则创建
    • a 追加,如果文件存在,指针会放在文件的结尾,不存在,创建新文件并写入
    • rb 以二进制读取内容
    • wb 以二进制写入内容 开发中更多的时候会以只读,只写的方式来操作文件 2、读写文件read,write
  • read方法一次性读入并返回文件的所有内容,执行后,文件指针会移动到文件的末尾
  • readline方法可以一次读取一行内容
  • 方法执行后,会把文件指针移动到下一行,准备再次读取,读取大文件时,使用此方法在while循环中,依次读取,节约内存 3、关闭文件close
  • close,如果忘记关闭文件,会造成系统资源消耗,且会影响到后续对文件的访问

文件指针

  • 文件指针标记从哪个位置开始读取数据
  • 第一次打开文件时,通常文件指针会指向文件的开始位置,当执行read后,文件指针移动到末尾
  • 在同一个python文件中,如果执行了read,那么再次使用此方法时,时无法获得内容的,可以使用seek方法改变指针位置

文件/目录的常用管理操作

在python中,使用代码实现文件目录操作,需要导入os模块 文件操作 os.rename(源文件名,目标文件名) os.remove(文件名) 目录操作 os.listdir 目录列表,类似ls os.mkdir 创建目录,和linux一致 os.rmdir 删除目录 os.chdir 修改工作目录 os.getcwd 获取当前工作目录current work directory os.path.isdir(文件路径) 判断是否是目录 os.path.isfile 判断是否是文件

python 文件操作seek() 和 telll()

file.seek()方法格式: seek(offset,whence=0)   移动文件读取指针到制定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数。 whence: 给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头算起,1代表开始从当前位置开始算起,2代表从文件末尾开始算起。当有换行时,会被换行截断。 seek()无返回值,故值为None   tell() : 文科文件的当前位置,即tell是获取文件指针位置。 readline(n):读入若干行,n代表读入的最长字节数。 readlines() :读入所有行的内容 read读入所有行的内容

上下文管理器

普通版: def A1(): f=open(“out.txt”,”w”) f.write(“123”) f.close() 威胁:如果调用异常,资源卡住,无法释放     升级版: def A1(): f=open(“out.txt”,”w”) try: f.write(“123”) except IOError: print(“error”) finally: f.close() 优雅版: def A1(): with open(“out.txt”,“w”) as f: f.write(“123”)

优雅的With as语句

Python提供了With语句语法,来构建对资源创建与释放的语法糖。给Database添加两个魔法方法:

‘’’python

class Database(object):

def __enter__(self):

self.connect()

return self

def __exit__(self, exc_type, exc_val, exc_tb):

self.close()
‘’’
然后修改handle_query函数如下:

def handle_query():

with Database() as db:

print ‘handle —‘, db.query()
‘’’
在Database类实例的时候,使用with语句。一切正常work。比起装饰器的版本,虽然多写了一些字符,但是代码可读性变强了

io模块

StringIO顾名思义就是在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

from io import StringIO
f = StringIO()
print(f.write('hello py1 '))  # 10
print(f.write('hello py2 '))  # 10
print(f.write('hello py3 '))  # 10
print(f.getvalue()) # hello py1 hello py2 hello py3

要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:

from io import StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
print(f.read())

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO

from io import BytesIO
f = BytesIO() 
print(f.write('中文'.encode('utf-8')))
# 请注意,写入的不是str,而是经过UTF-8编码的bytes

print(f.getvalue()) # b'\xe4\xb8\xad\xe6\x96\x87'

BytesIO

和StringIO类似,也可以用一个bytes初始化BytesIO,然后,像读文件一样读取:

from io import StringIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()
b'\xe4\xb8\xad\xe6\x96\x87'

StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。  

os模块

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径

os.chdir(``"dirname"``)  改变当前脚本工作目录;相当于shell下cd

os.curdir  返回当前目录: (``'.'``)

os.pardir  获取当前目录的父目录字符串名:(``'..'``)

os.makedirs(``'dirname1/dirname2'``)    可生成多层递归目录

os.removedirs(``'dirname1'``)    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

os.mkdir(``'dirname'``)    生成单级目录;相当于shell中mkdir dirname

os.rmdir(``'dirname'``)    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

os.listdir(``'dirname'``)    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

os.remove()  删除一个文件

os.rename(``"oldname"``,``"newname"``)  重命名文件``/``目录

os.stat(``'path/filename'``)  获取文件``/``目录信息

os.sep    输出操作系统特定的路径分隔符,win下为``"\\",Linux下为"``/``"

os.linesep    输出当前平台使用的行终止符,win下为``"\t\n"``,Linux下为``"\n"

os.pathsep    输出用于分割文件路径的字符串

os.name    输出字符串指示当前使用平台。win``-``>``'nt'``; Linux``-``>``'posix'

os.system(``"bash command"``)  运行shell命令,直接显示

os.environ  获取系统环境变量

os.path.abspath(path)  返回path规范化的绝对路径

os.path.split(path)  将path分割成目录和文件名二元组返回

os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素

os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素

os.path.exists(path)  如果path存在,返回``True``;如果path不存在,返回``False

os.path.isabs(path)  如果path是绝对路径,返回``True

os.path.isfile(path)  如果path是一个存在的文件,返回``True``。否则返回``False

os.path.isdir(path)  如果path是一个存在的目录,则返回``True``。否则返回``False

os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间

os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

4.sys模块

sys.argv           命令行参数``List``,第一个元素是程序本身路径

sys.exit(n)        退出程序,正常退出时exit(``0``)

sys.version        获取Python解释程序的版本信息

sys.maxint         最大的``Int``值

sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.platform       返回操作系统平台名称

sys.stdout.write(``'please:'``)

val ``=``sys.stdin.readline()[:``-``1``]

shutil模块:https://docs.python.org/3/library/shutil.html?highlight=shutil#module-shutil

私有属性和方法

如果有一个对象,当需要对其进行修改属性时,有2种方法: (1)对象名.属性名=数据—->直接修改 (2)对象名.方法名()—–>间接修改 为了更好的保障属性安全,不能随意修改,一般处理方式为: (1)将属性定义为私有属性 (2)添加一个可以调用的方法,供调用,也就是间接调用属性 私有方法是不能直接调用的

欢迎关注我的其它发布渠道