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创建临时文件(名)
uuuu 格式的编码/解码
zipfile用于读取ZIP归档文件的工具
    原文作者:JaeGwen
    原文地址: https://www.jianshu.com/p/d8124bf77a08
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞