1.1给出规格化得地址字符串,这些字符串是经过转义的能直接在代码里使用的字符串

  需要导入os模块 import os

>>>os.path.join('user','bin','spam')  #可以看做为连接,值得注意的是,不要认为只能这样来连接单个
'user\\bin\\spam'  #运行结果 >>>for fileName in os.listdir(path):
totalSize=os.path.getsize(os.path.join(path,fileName))+totalSize
#使用os.path.join()来连接

1.2当前工作目录 os.getcwd() 与 os.chdir(parameter)

  

 >>>import os
>>>os.getcwd() #取得当前工作路径的字符串
'C:\\Python3'
>>>os.chdir('C:\\Windows\\System32') #改变工作路径为传入的字符#串
#若传入路径不存在,显示FileNotFoundError错误
>>>os.getcwd()
'C:\\Windows\\System32'

1.3绝对路径与相对路径

  这个没什么好说的,就是需要注意下逻辑层次是从当前目录出发的

1.4创建新文件夹 os.makedirs(parameter)

  方法执行成功后,会创建所有必要的中间文件夹

1.5处理绝对路径与相对路径寻找从A到B的 os.path.relpath(path,start) 、地址字符串裁切:  os.path.basename(path) 、 os.path.dirname(path) 、  os.path.split(path)

 >>>os.path.abspath('.')    #将返回参数的绝对路径字符串
‘C:\\python3’
>>>os.path.isabs('.') #参数是绝对路径是返回True,否则False
False >>>os.path.relpath('C:\\Windows','C:\\')  #从后者到前者的路径。若是没有提供Start,就把当前目录作为Start
‘Windows’ >>>path='C:\\Windows\\System32\\calc.exe'
>>>os.path.dirname(path)  #返回一个包含最后一个斜杠之前内容的字符串
‘C:\\Windows\\System32’
>>>os.path.basename(path)  #返回一个包含最后一个斜杠之后内容的字符串
‘calc.exe’

  而当同时需要一个路径的目录名称和基本名称,就可以调用 os.path.split(path)来获得这两个字符串的元组

 >>>path='C:\\Windows\\System32\\calc.exe'
>>>os.path.split(path)
('C:\\Windows\\System32','calc.exe')

  此功能也可通过调用 os.path.dirname(path)   os.path.basename(path) 来实现,不过你也看出来了,显然上者更应该得到我们青睐

 >>>(os.path.dirname(path),os.path.basename(path))
('C:\\Windows\\System32','calc.exe')

  此外, os.path.split(path) 并不能接受一个文件路径并返回每个文件夹的字符串的列表。假如你想要实现这样的功能,可以使用 split() 字符串方法,并根据 os.path.sep 中的字符串进行分割,即将变量: os.path.sep 设置为适配与平台的正确的文件夹分割斜杠

 >>>path='C:\\Windows\\System32\\calc.exe'
path.split(os.path.sep)    #spilt()方法将返回一个列表,包含该路径的所有部分,如果向他传递os.path.sep,就能在所有操作平台上工作
['C:','Windows','System32','calc.exe']

1.7查看文件大小和文件夹内容

 >>>os.path.getsize('C:\\Windows\\System32\\calc.exe')
776192
>>>os.listdir('C:\\Windows\\System32') #返回的是所提供的文件夹里所有文件名的字符串 ********注意这个在os里,不是os.path里
['1232049.cpx',
--snip---
'2398r09w.dll']

  示例:

 >>>totalSize=0
>>>path=os.getcwd()
>>>for fileName in os.listdir(path):
totalSize=os.path.getsize(os.path.join(path,fileName))+totalSize
#使用os.path.join()来连接
''

1.8 检查路径有效性

 >>>os.path.exists('C:\\Windows')    #若指定文件夹存在
True
>>>os.path.isdir('C:\\Windows\\System32') #若指定的参数存在,且是一个文件
True
>>>os.path.isfile('C:\\Windows\\System32') #若指定的参数存在并且是一个文件夹
False

2文件读写过程

  适用于纯文本文件(即只包含基本文字字符,不包含字体、大小和颜色信息),关于二进制文件的先不做讨论,只需要知道,python中有很多模块,这些模块,使得对二进制文件的处理变得更加容易。这里我们以shelve模块为例

  1.1读写文件

  python中,读写文件有3个步骤:

    1.调用open(parameter)函数,返回一个File对象。如果文件不存在,会创建

    2.调用File对象的read()、readlines()或write()方法。

    3.调用File对象的close()方法,关闭该文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

    4.见补充

 >>>path='C:\\Windows\\System32'
>>>helloFile=open(path)
>>>helloContent=helloFile.read()  #read()方法返回一个大字符串
>>>helloContent
'Hello World\nHello World'
6 >>>helloContent=helloFile.readlines()  #readlines()方法返回一个字符串的列表,每个字符串值都已一个换行字符'\n’结束
7 >>>helloContent
8 ['Hello Content\n','Hello Content\n']

  读模式、写模式、添加模式

    是以传给open(parameter1,parameter2)的parameter2参数来区分的

  关于 open() 的更多信息:点击

>>>baconFile=open('bacon.txt','w')    #w代表写模式,会将原有的全部清除
>>>baconFile.write('Hello world!\n') #返回写入字符的个数
13
>>>baconFile.close()
>>>baconFile=open('bacon.txt','a') #a代表添加模式
>>>baconFile.write('Bacon is not a vegetable.') #返回写入字符的个数
25

  关于写模式

  你可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用 with 语句来得保险:

with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')

  'w'和‘a’模式的区别,前者会直接覆盖,后者会向已有文件追加内容  

  要写入特定编码的文本文件,请给 open() 函数传入 encoding 参数,将字符串自动转换成指定编码。

  在python中使用多行字符串写入

def main():
filename='instance.py'
path=os.path.abspath('.') code='''print('dir -l1')
s
a
'''
pass
#结果
print('dir -l1')
s
a

  

3用shelve模块保存变量及删除Shelve键值对

  利用shelve模块,可以将python程序中的变量保存到二进制的shelf文件中。

>>>import shelve
>>>shelfFile=shelve.open('mydata') #open()方法传入的是文件名,返回的值保存在变量‘shelfFile’中 *********若mydata不存在,会创建一个
>>>cats=['Zophie','Pooka','Simon']
>>>shelfFile['cats']=cats #这个变量的值是cats(后),键也是cats(前)。键和值相互关联,就像是一个字典一样。cats(后)又被称为shelf值,这个值可以死列表(如上)
>>>shelfFile.close()

  稍后可以使用shelve模块,重新打开这些文件并取出数据。不比选择读模式或者写模式,因为他们既能读,又能写

>>> shelfFile=shelve.open('mydata')
>>> type(shelveFile)
<class 'shelve.DbfilenameShelf'>
>>> shelfFile['cats']
['Zophie', 'Pooka', 'Simon']
>>>shelfFile.close()

  shelve的keys()与values()方法   **********要记得是keys()不是key()

shelfFile=shelve.open('mydata')
>>> list(shelfFile.keys())  #这些方法返回类似列表的值,而不是真正列表,所以应该将他们传递给list()函数,取得列表的形式
['cats']
>>> list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
>>> shelfFile.close()

  删除shelve中的键值对

del shelfFile['cats']

  shelve有 items() 方法

>>> for items in mcbShelve.items():
items
('test', " and sys.argv[1].lower=='save'")

4用pprint.pformat()函数保存变量

   pprint.pprint() 函数将列表或字典中的内容漂亮打印到屏幕,而 pprint.pformat() 函数将返回同样的文本字符串,利用他可以将要保存的字符串到一个.py文件中

>>> import pprint
>>> cats=[{'doec': 'chubby', 'name': 'Zophie'}, {'dese': 'fluffy', 'name': 'pooka'}]
>>> pprint.pformat(cats)
"[{'doec': 'chubby', 'name': 'Zophie'}, {'dese': 'fluffy', 'name': 'pooka'}]"
>>> fileObj=open('myCats.py','w')
>>> fileObj.write('cats='+pprint.pformat(cats)+'\n') #这样保存
81
>>> fileObj.close()

  可以导入自己创建的.py文件

>>> import myCats
>>> myCats.cats
[{'doec': 'chubby', 'name': 'Zophie'}, {'dese': 'fluffy', 'name': 'pooka'}]
>>> myCats.cats[0]
{'doec': 'chubby', 'name': 'Zophie'}

  虽然创建一个.py文件能让任何人都能用一个简单的文本编辑器读取和修改文件的内容,但是用shelve模块来保存数据,是将变量保存到文件的最佳方式。因为只有基本数据类型:整形、浮点型、字符串、列表和字典,可以作为简单文本写入一个文件。

四、字符编码

  要读取非UTF-8编码的文本文件,需要给 open() 函数传入 encoding 参数,例如,读取GBK编码的文件

  遇到有些编码不规范的文件,你可能会遇到 UnicodeDecodeError ,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况, open() 函数还接收一个 errors 参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

  更多errors参数:http://www.runoob.com/python/att-string-encode.html

五、补充

  由于文件读写过程中可能会产生 IOError ,而一旦出错,后面的 f.close 就不会调用,所以为了保证无论是否出错都能够调用 f.close() ,我们使用 try...finally 来实现:

try:
f=open('C:/Systems/test.txt','r')
print(f.read())
finally:
if f:
f.close()

  但每次这样写会觉得太繁琐,所以我们用 with...as 语句,python引入了with语句来帮我们自动调用 close() 方法。

with open('C:/Systems/test.txt','r') as f:
print(f.read())

  

  调用 read() 方法会一次读取全部文件,假如文件特别大,超出了内存的容量,那么内存就爆了,我们可以使用 read(size) 方法来帮助我们一次读取size大小的文件。另外,还可以调用 readline() 方法, readlines() 他会读取全部内容然后返回一个按行的list

file-like object

  像函数 open() 返回的这种有个 read() 方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个 read() 方法就行。 StringIO (这个应该是使用open()返回的对象)就是在内存中创建的file-like Object,常用作临时缓冲。

二进制文件

  直接以默认的方式调用open(),打开的是文本文件,并且是utf-8编码的,若是需要打开二进制文件(如图片、视频)需要向open()传入rb参数

>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节

打开非utf-8编码文件:

  向open()传入encoding参数

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

  使用errors参数定义遇到错误时的处理方式,比如遇到编码不规范的文件,则会出现UnicodeDecodeError错误

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

  

  

  

Python IO编程-读写文件的更多相关文章

  1. Python IO编程-组织文件

    对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...

  2. Python I/O编程 --读写文件、StringIO/ BytesIO

    I/O编程 Input/Output  输入/输出 Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水 Input Stream就是数据从外面(磁盘.网络)流进内存,Ou ...

  3. Python3 IO编程之文件读写

    读写文件是最常见的IO操作.python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一个,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序终结操作磁盘, ...

  4. Commons IO方便读写文件的工具类

    Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写文件,url源代码等. 普通地读取一个网页的源代码的代码可能如下 InputStr ...

  5. Java IO如何读写文件

    Java把这些不同来源和目标的数据都统一抽象为数据流:Java语言的输入输出功能是十分强大而灵活的:在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上 ...

  6. 第五篇:使用无缓冲IO函数读写文件

    前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文 ...

  7. 使用无缓冲IO函数读写文件

    前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文 ...

  8. python IO编程-StringIO和BytesIO

    链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319187857 ...

  9. IO流 读写文件

    读写文件 如前所述,一个流被定义为一个数据序列.输入流用于从源读取数据,输出流用于向目标写数据. 下图是一个描述输入流和输出流的类层次图. 下面将要讨论的两个重要的流是 FileInputStream ...

随机推荐

  1. CodeForces 453A 概率题

    Description Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter ...

  2. asp.net控件的异步刷新

    需求:我们知道,asp.net控件中的button控件,默认是开启了自己主动回发的,而有时候.我们不想刷新整个界面.而仅仅想局部刷新,可页面中又偏偏用到了.net button控件. 尽管我非常讨厌. ...

  3. Fitnesse FIT的使用

    FIT是fitnesse使用的默认的引擎(SLIM的使用在上一篇文章中说明),不需要特别声明即可使用执行表格测试,所有编写的fixture都需要继承Fit的Fitxture 编写测试用例前需要先声明c ...

  4. luogu1541 乌龟棋 动态规划

    题目大意 一行格子,每个格子里有数字.一些卡片,卡片上有1.2.3.4这几种数字.一开始你在格子1,随后每次选一个卡片,你可以前进卡片上的数字个格子,得到格子上的分数,然后讲该卡片丢弃.求取卡片的顺序 ...

  5. 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)

    1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...

  6. 备份SQL SERVER 2005数据库

  7. hammer教程

    一.前言 移动端框架当前还处在初级阶段,但相对于移动端的应用来说已经有很长时间了.虽然暂时还没有PC端开发的需求量大,但移动端的Web必然是一种趋势,在接触移动端脚本的过程中,最开始想到的是juqer ...

  8. shell 杂集

    1.shell 相等比较注意 -eq 数字相等的比较 == 字符串相等的比较 2.== 和 = 的区别 == 可用于判断变量是否相等,= 除了可用于判断变量是否相等外,还可以表示赋值. = 与 ==  ...

  9. jquery 获取及设置input各种类型的值

    获取选中的值 获取一组radio被选中项的值 var item = $(“input[@name=items]:checked”).val(); 获取select被选中项的文本 var item = ...

  10. MySQL定时任务与存储过程实例

    shell 定时任务:​/usr/bin/mysql -uroot -pxxxxx databasename -e "update table set ......."​​mysq ...