Python 目录和文件操作

From: http://www.cnblogs.com/zhoujie/archive/2013/04/10/python7.html

目录和文件操作

语言只有和外部连起来操作才会实现更强大的功能,比如操作文件、数据库等,这样数据可以有一块单独存储的地方,而不是存放在内存中。更强大的是网络编程,当然这些后续都会学习。接下来学习python对目录和文件的操作。前面的笔记都是基础理论知识,我觉得从这里开始几乎就可以干一些事了。

有关文件夹与文件的查找,删除等功能 在os模块中实现。使用时需先导入这个模块:import  os

目录

1、取得当前目录——os.getcwd()

>>>importos>>> s=os.getcwd()#获得当前运行脚本所在目录>>>s'C:\\Python27'

比如运行test.py,那么输入该命令就会返回脚本所在的文件夹位置。

例如将test.py放入A文件夹。并且希望不管将A文件夹放在硬盘的哪个位置,都可以在A文件夹内生成一个新文件夹。且文件夹的名字根据时间自动生成。

>>>importos>>>importtime>>> folder = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())>>>os.makedirs(r'%s/%s'%(os.getcwd(),folder))#创建以时间命名文件夹名

这是运行脚本的目录即'C:\\Python27'下多了一个以当前时间命名的文件夹

2、创建子目录——os.makedirs("path"),path是要创建的子目录

>>> os.makedirs("C:\\temp\\test")#这是C盘下就创建了temp目录,temp下嵌套的文件夹是test

(当然,也可能创建失败,比如path已存在,或者驱动器不在,或者无写权限等等)

3、更改当前目录——os.chdir()

相当于dos或Linux下的cd命令

>>> os.chdir('c:\\')#将当前目录改为C盘根目录下

4、将路径分解为目录名和文件名——os.path.split()

格式为:fpath , fname = os.path.split( "要分解的路径")

>>> a,b=os.path.split("c:\\dir1\\dir2\\file.txt")>>>printa

c:\dir1\dir2>>>printb

file.txt

5、分解文件名的扩展名——os.path.splitext()

格式为:fpath_name , ftext = os.path.splitext( "要分解的路径")

>>> a,b=os.path.splitext("c:\\dir1\\dir2\\file.txt")>>>printa

c:\dir1\dir2\file>>>printb

.txt

6、判断一个路径(目录或文件)是否存在——os.path.exists()

格式为:os.path.exists(“要判断的路径或文件”)

>>> os.path .exists ("C:\\")#该路径存在True>>> os.path .exists ("C:\\123\\")#该路径不存在False>>> os.path .exists ("C:\\123.txt")#该文件不存在False>>> os.path .exists ("C:\\test.txt")#该文件存在True

7、判断一个路径是否有需要的文件——os.path.isfile("文件")

>>> os.path .isfile("C:\\test.txt")

True>>> os.path .isfile("C:\\123.txt")

False

8、判断一个路径是否存在——os.path.isdir("路径")

>>> os.path .isdir("C:\\")

True>>> os.path .isdir("H:\\")

False

9、获取目录中的文件及子目录的列表——os.listdir("路径")

相当于Windows下powershell中获取Get-ChildItem命令和Linux中的ls命令。但是这个显示不是以常见的列表的形式:

>>> os.listdir("C:\\")  #这里包括隐藏文件也显示出来了

['$Recycle.Bin','360ld','360rescue','360SANDBOX','360SysRt','Boot','bootmgr','BOOTSECT.BAK','CacheTemp','Documents and Settings','grldr','IFRToolLog.txt','inetpub','MSOCache','pagefile.sys','Program Files','Program Files (x86)','ProgramData','Python27','Recovery','RECYCLER','SBTDR','System Volume Information','test.txt','Users','Windows']

示例:获取指定目录下的所有子目录的列表

+ View Code

获取指定目录下所有文件的列表

+ View Code

10、删除子目录——os.rmdir("path"),只能删除空目录

>>> os.rmdir("C:\\temp\\test")#注意只删除了test目录>>> os.rmdir("C:\\temp")#这里才删除了temp目录

文件

python中模块的引入使得对文件的操作变的很简单。最基本的文件操作就是在文件中进行读写数据,在操作文件之前要打开文件。

打开文件——open('file'[,'mode'])

>>>import os

>>>os.getcwd()'c:\\'>>> file=open('test.txt')#默认的mode是'r',即读模式>>>file.read()  #读取文件内容'hello\nworld\nhello,python'  #  \n在文件中的形式是换行

mode的选项即含义如下:

模 式

描述

r

以读方式打开文件,可读取文件信息。

w

以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容;如果文件不存在则创建

a

以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建

r+

以读写方式打开文件,可对文件进行读和写操作。

w+

消除文件内容,然后以读写方式打开文件。

a+

以读写方式打开文件,并把文件指针移到文件尾。

b

以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

关于文件的其他操作我觉得没必要记录的很详细了,因为基本都很简单,下面列出的是文件的常用方法,并且在例子中有相关说明。另外有一点注意的是读取文件中经常存在的编码问题。不同的解释器默认的编码不同,具体解决方案会再介绍。

常见文件操作方法:

方法

描述

f.close()

关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。

f.name()

获取文件名称

f.next()

返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。

f.fileno()

获得文件描述符,是一个数字。返回一个长整型的”文件标签“

f.flush()

刷新输出缓存,把缓冲区的内容写入硬盘

f.isatty()

如果文件是一个终端设备文件(Linux系统中),则返回True,否则返回False。

f.read([size])

读出文件,size为读取的长度,以byte为单位

f.readline([size])

读出一行信息,若定义了size,则读出 一行的一部分

f.readlines([size])

读出所有行,也就是读出整个文件的信息。(把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分)

f.seek(offset[,where])

把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。(注意:如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾)

f.tell()

获得文件指针位置,标记当前位置,以文件开头为原点

f.truncate([size])

把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

f.write(string)

把string字符串写入文件,write()不会在str后加上一个换行符。

f.writelines(list)

把list中的字符串一行一行地写入文件,是连续写入文件,没有换行。

现有一个test.txt文件,格式如下:

hello

world

hello

python

下面是一些常见操作:

>>> file=open('test.txt')>>> file.read (4)#读取前4个字节'hell'>>> file.read(6)#注意这里是在刚才读过的基础上再向后读的'o\nworl'>>> file.read ()#不指定size,则读到文件结尾'd\nhello\npython'>>> file.read()#再读时已是文件结尾''>>> file.seek(0)#将文件位置定位到第一个字节>>> file.readline ()#一次读一行'hello\n'>>>file.readline ()'world\n'>>> file.seek(0)#将文件定位到开始>>> file.readlines ()#读取整个文件的内容['hello\n','world\n','hello\n','python']

>>> file .tell()#读完之后显示seek位置,即文件的最后了

27L#以长整型表示

>>> file.name#查看文件的名称

'test.txt'

>>> file.close()#关闭文件

刚开始测试read和readline等用法的时候,因为只要读取一次就在上次基础上往后读,当时我还以为这是一个出栈操作,显然,知道有seek这个方法后,我才知道它不是,只是每次读的时候seek的位置就往后移动一个,而每次读取是以seek所在的位置为起点的。所以如果需要从头开始读取文件内容时,将文件位置设为开始即可,即seek(0)。

>>> file=open('test.txt','w')>>> file.write ('\nwelcome')#会将之前的内容覆盖>>> file.writelines ('I love python')>>> file.close ()#关闭文件时才能看到文件内容的修改

>>> file=open('test.txt','a')#追加到文件尾,而不会覆盖>>> file.writelines ('this is a test')>>> file.close()

对文件的相关操作有时需要引入shutil模块:

>>>importshutil>>> shutil.copyfile('test.txt','123.txt')#参数只能是文件>>> shutil.copy("olddir","newfileordir")#olddir只能是文件夹,newfile可以是文件,也可以是目标目录>>> shutil.copytree("olddir","newdir")#olddir和newdir都只能是目录,且newdir必须不存在>>> shutil.move("oldpos","newpos")#移动文件或目录>>> shutil.rmtree("dir")#空目录、有内容的目录都可以删>>>importos

>>>os.rmdir("dir")#只能删除空目录>>> os.remove("file")#删除文件>>> os.rename("oldname","newname")#文件或目录都是使用这条命令

关于文件和目录操作的总结,推荐博客:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html

文件编码:

#获得当前环境默认编码>>>importsys>>>importlocale>>>sys.getdefaultencoding()# 返回当前系统所使用的默认字符编码'ascii'>>>sys.getfilesystemencoding ()# 返回用于转换Unicode文件名至系统文件名所使用的编码'mbcs'>>>locale.getdefaultlocale()# 获取默认的区域设置并返回元组(语言, 编码)('zh_CN','cp936')>>>locale .getpreferredencoding ()# 返回用户设定的文本数据编码'cp936'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容