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. 使用excel进行数据挖掘(2)----分析关键影响因素

    使用excel进行数据挖掘(2)----分析关键影响因素 在配置环境后,能够使用excel进行数据挖掘. 环境配置问题可參阅: http://blog.csdn.net/xinxing__8185/a ...

  2. MySQL改动rootpassword的多种方法

     方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newp ...

  3. PAAS平台的web应用性能測试与分析

    引言 为什么我会写这一篇博客,由于近期非常多京东云擎jae的用户反应一个问题就是他们部署在jae上面的应用訪问非常慢,有极少数应用甚至常常出现504超时现象.当然大家首先想到的是jae性能太差,这也是 ...

  4. hdu 4865 Peter&#39;s Hobby(2014 多校联合第一场 E)

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  5. 百度2016研发project师笔试题(四)

    百度2016研发project师笔试题(四) 2015/12/8 10:42(网上收集整理的,參考答案在后面.若有错误请大神指出) 1. 关于MapReduce的描写叙述错误的是() A. 一个Tas ...

  6. C语言开发函数库时利用不透明指针对外隐藏结构体细节

    1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力降低和其调用方的耦合.是最主要的设计标准. C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必定 ...

  7. Web API接口设计(学习)

    1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...

  8. ASP.NET MVC2 Web项目中公用类库的问题

    ASP.NET WEB窗体 网站中,加入公用类文件的话,系统会很自动并殷勤的问你,说要不要把它存放在文件夹 App_Code 里.一旦加入,全站都可以很方便地加以使用,一点问题没有. 这种习以为常的方 ...

  9. bzoj2958: 序列染色(DP)

    2958: 序列染色 题目:传送门 题解: 大难题啊(还是我太菜了) %一发大佬QTT 代码: #include<cstdio> #include<cstring> #incl ...

  10. 【撸码caffe 二】 blob.hpp

    Blob类是caffe中对处理和传递的实际数据的封装,是caffe中基本的数据存储单元,包括前向传播中的图像数据,反向传播中的梯度数据以及网络层间的中间数据变量(包括权值,偏置等),训练模型的参数等等 ...