python核心编程-文件和输入输出

本章将介绍python的文件处理和相关输入输出能力。
包括介绍文件对象(它的内建函数、内建方法和属性)、标准文件、同时讨论文件系统的访问方法、文件执行、最后简洁介绍持久存储和标准库中与文件有关的模块

内建函数open()和file() 提供了初始化输入/输出(I/O)操作的通用接口。
内建函数open()
基本语法:
file_object = open(file_name,access_mode='r',buffering=-1)
file_name是包含要打开的文件名字的字符串,它可以是相对路径或者绝对路径。可选变量access_mode也是一个字符串,代表打开文件的模式,默认是读取模式'r'

一些打开文件的例子:

fp = open('/etc/motd') #以读的方式打开
fp = open('test', 'w') #以写的方式打开
fp = open('data', 'r+') #以读写方式打开
fp = open(r'c: \io.sys', 'rb') #以二进制读模式打开

工厂函数file()

open()和file()函数具有相同的功能,可以任意替换。

文件的内建方法

In [1]: f = open('/tmp/test3','r+')
In [2]: f.
f.close       f.fileno      f.name        f.readinto    f.softspace   f.writelines
f.closed      f.flush       f.newlines    f.readline    f.tell        f.xreadlines
f.encoding    f.isatty      f.next        f.readlines   f.truncate    
f.errors      f.mode        f.read        f.seek        f.write     

#输入
#read()方法用来读取字节到字符串中,最多读取给定数目个字节。
#readline()方法读取打开文件的一行(读取下个行结束符之前的所有字节)。然后整行,包括行结束,作为字符串返回。
#readlines()会读取所有(剩余的)行然后把它们作为一个字符串列表返回。它的可选参数sizehit代表返回的最大字节大小
#xreadlines()不是一次性读取所有行,而是每次读取一块,所以用在for循环时可以减小对内存的占用,不过,随着Python中的迭代器和文件迭代的引入,没有必要再使用xreadlines(),因为与使用iter(file)和在for循环中文件迭代 for eachLine in file效果是一样的。

#输出
#write()方法把含有文本数据或者二进制数据块的字符串写入到文件中。
#writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将它们写入文件。行结束符并不会被自动加入,必须在调用writelines()前给每行结尾加入上行结束符。

#文件内移动
#seek()方法可以在文件中移动文件指针到不同的位置。offset字节代表相对于某个位置的偏移量。位置的默认值为0,代表从文件的开头算起(即绝对偏移量),1代表从当前位置算起,2代表从文件末尾算起。

#文件迭代
#一行一行的访问文件很简单: 
for eachLine in f
...
#在这个循环里,eachLine代表文本文件中的一行(包括末尾的行结束符)。


#其他
#close() 通过关闭文件来结束对它的访问。Python垃圾收集机制也会在文件对象的引用计数降至零的时候关闭文件。如果你不显式地关闭文件,那么你可能丢失输出缓冲区的数据。
#fileno()方法返回打开文件的描述符。
#flush()方法会直接把内部缓冲区中的数据立即写入文件,而不是被动地等待输出缓冲区被写入。
#isatty()方法是一个布尔内建函数,当文件是一个类tty设备时返回True,否则返回False
#truncate()方法是将文件截取到当前文件指针位置或者到给定size,以字节为单位

  • 有助于开平台开发的os模块属性
os 模块属性 描述
linesep 用于在文件中分隔行的字符串
sep 用于分隔文件路径名的字符串
pathsep 用于分隔文件路径名的字符串
curdir 当前工作目录的字符串名称
pardir (当前工作目录)父目录字符串名称
filename = raw_input('Enter file name: ')
fobj = open(filename,'w')
while True:
    aLine = raw_input('Enter a line('.' to quit): ')
    if aLine != '.':
        fobj.write('%s%s' % (aLine,os.linesep))
    else:
        break
fobj.close()
标准文件

一般来说,只要你的程序一执行,你就可以访问3个标准文件。它们分别是标准输入(一般是键盘)、标准输出(到显示器的缓冲输出)和标准错误(到屏幕的非缓冲输出),命名分别是stdin stdout stderr
Python中可以通过sys模块来访问这些文件的句柄。导入sys模块之后,就可以使用sys.stdin sys.stdout sys.stderr来访问。
print语句通常是输出到sys.stdout 而内建函数 raw_input()则通常从sys.stdin接收输入

命令行参数

sys模块通过 sys.argv 属性提供了对命令行参数的访问。
argv 变量代表一个从命令行上输入的各个参数组成的字符串数组;
argc 变量代表输入的参数个数
在Python中,argc就是sys.argv列表的长度,即len(sys.argv),而该列表的第一项sys.argv[0] 永远是程序的名称
总结如下:

  • ** sys.argv 是命令行参数的列表**
  • ** len(sys.argv) 是命令行参数的个数(也就是sys.argc

测试程序:

import sys

print 'you entered', len(sys.argv), 'arguments...'
pring 'they are: ',str(sys.argv)

$argv.py 76 tales 85 hawk
you entered 5 arguments...
they are: ['argv.py','76','tales','85','hawk']

os和os.path模块的例子(ospathex.py)
#!/usr/bin/env python

import os
for tmpdir in ('/tmp',r'c: \temp'):
    if os.path.isdir(tmpdir):
        break
else:
    print 'no temp directory available'
    tmpdir = ''

if tmpdir:
    os.chdir(tmpdir)
    cwd = os.getcwd()
    print '*** current temporary directory'
    print cwd

    print '*** creating example directory...'
    os.mkdir('example')
    os.chdir('example')
    cwd = os.getcwd()

    print '*** new working directory...'
    print cwd
    
    print '*** original directory listing:'
    print os.listdir(cwd)

    print '*** creating test file ...'
    fobj = open('test','w')
    fobj.write('foo\n')
    aline = 'bar'
    fobj.write('%s%s' %(aline,os.linesep))
    fobj.close()

    print '*** updated directory listing:'
    print os.listdir(cwd)

    print "*** renaming 'test' to 'filetest.txt'"
    os.rename('test','filetest.txt')
    print '*** updated directory listing:'
    print os.listdir(cwd)

    path = os.path.join(cwd,os.listdir(cwd)[0])
    print '*** full file pathname:'
    print path
    print '*** (pathname,basename) =='
    print os.path.split(path)
    print '*** (filename,extension) =='
    print os.path.splittext(os.path.basename(path))

    print '*** displaying file contents:'
    fobj = open(path)
    for eachLine in fobj:
        print eachLine
    fobj.close()

    print '*** deleting test file'
    os.remove(path)
    print '*** updated directory listing:'
    print os.listdir(cwd)
    os.chdir(os.pardir)
    
    print '*** deleting test directory'
    os.rmdir('example')
    print '*** Done'

文件执行
  • 永久存储模块
    pickle模块
    marshal模块

文件相关模块

模块 内容
base64 提供二进制字符串和文本字符串间的编码/解码操作
binascii 提供二进制和ASCII编码的二进制字符串间的编码/解码操作
bz2 访问BZ2格式的压缩文件
csv 访问csv文件(以逗号分隔文件)
filecmp 用于比较目录和文件
fileinput 提供多个文本文件的行迭代器
getopt/optparse 提供了命令行参数的解析/处理
gzip/zlib 读写GNU zip(gzip)文件(压缩需要zlib 模块)
shutil 提供高级文件访问功能
c/StringIO 对字符串对象提供类文件接口
tarfile 读写TAR归档文件,支持压缩文件
tempfile 创建临时文件(名)
uu uu 格式的编码/解码
zipfile 用于读取ZIP归档文件的工具
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,667评论 0 27
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,484评论 1 118
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,013评论 2 34
  • 当岁月的黑色素沉积成斑点 一同沉积的还有 曾经飞扬的心 有多久没有歇斯底里地笑了 当现实的风霜削磨成面具 一起削磨...
    忆如斯阅读 224评论 0 0
  • 欢迎来到仰心一笑的书房有些话,我想说给你听有些书,我想读给你看 我们需要在哪里修行? 我们该用什么态度去工作? 我...
    仰心的人生提案阅读 445评论 0 0