文件的输入输出

  1. 云栖社区>
  2. 博客>
  3. 正文

文件的输入输出

技术小美 2017-11-16 15:40:00 浏览1043
展开阅读全文

文件只是连续的字节序列。数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成。


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

1、调用open()函数,返回一个file对象

2、调用file对象的read()和write()方法

3、调用file对象的close()方法,关闭该文件


文件内建函数open()和file()


file_object=open(file_name,access_mode='r',buffering=-1)


通常,文件使用模式‘r’,‘w’,或是‘a’模式来打开,分别代表读取,写入和追加。还有个‘U’模式,代表通用换行符支持。


使用‘r’和‘U’模式打开的文件必须是已经存在的。使用‘w’模式打开的文件若存在则首先清空,然后重新创建。以‘a’模式打开的文件是为追加数据作准备的,所有写入的数据都将追加到文件的末尾。如果文件不存在,将被自动创建,类似以‘w’模式打开文件。此外,‘+’代表可读可写,‘b’代表二进制模式访问。


可选参数buffering用于指示访问文件所采用的缓冲方式。其中0表示不缓冲,1表示只缓冲一行数据,任何其他大于1的值代表使用给定值作为缓冲区大小。不提供该参数或给定负值代表使用系统默认缓冲机制,即对任何类电报机(tty)设备使用行缓冲,其他设备使用正常缓冲。


open()和file()函数具有相同的功能,可以任意替换。一般来说,建议使用open()读写文件,在想要说明正在处理的是文件对象时使用file()


不同平台用来表示行结束的符号是不同的。当使用‘U’标志打开文件的时候,所有的行分隔符通过python的输入方法返回时都会被替换为换行符NEWLINE(\n)。文件对象的newlines属性会记录它曾看到的文件的行结束符。

当文件刚被打开,程序还没有遇到行结束符,那么文件的newlines为None。在第一行被读取后,它被设置为第一行的结束符。如果遇到其他类型的行结束符,文件的newlines会成为一个包含每种格式的元组。注意UNS(通用换行符支持)只用于读取文本文件。没有对应的处理文件输出的方法。

在编译python的时候,UNS默认是打开的。如果不需要这个特性,在运行configure脚本时,可以使用--without-universal-newlines开关关闭它。


文件内建方法


open()成功执行后,文件的方法可分为四类:输入、输出、文件内移动及杂项操作。


read()方法用来直接读取字节到字符串中。默认文件将被读取直至末尾。

readline()方法读取打开文件的一行,包括行结束符,作为字符串返回。

readlines()方法读取所有剩余的行然后把它们作为一个字符串列表返回。


write()方法把含有文本数据或二进制数据块的字符串写入文件中去。

writelines()方法接收一个字符串列表作为参数,将它们写入文件。行结束符并不会被自动加入。


当使用read()或readline()从文件中读取行时,python并不会删除行结束符,这个操作留给了程序员:

f=open('myfile','r')

data=[line.strip() for line in f.readlines()]

f.close()

类似地,write()或writelines()也不会自动加入行结束符,需要在像文件写入数据前完成。


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

test()是对seek()的补充,它告诉你当前文件指针在文件中的位置,从文件起始算起,单位为字节。


一行一行访问文件很简单:

for eachLine in f:

  :


close()方法关闭文件结束对它的访问。如果不显式地关闭文件,那么可能会丢失缓冲区的数据。

fileno()方法返回打开文件的描述符。

flush()方法会直接把内部缓冲区中的数据立刻写入文件,而不是被动地等待输出缓冲区被写入。

isatty()是个布尔内建函数,当文件是个类tty设备时返回True,否则返回False。

truncate()方法将文件截取到当前文件指针位置或者到给定size,以字节为单位。


使用文件迭代器,每次只读取和显示一行:

filename=raw_input('enter file name:')

f=open(filename,'r')

for eachLine in f:

print eachLine,                       

f.close()


注意:print语句默认在输出内容末尾后加一个换行符,而在语句后加一个逗号就可以避免这个行为。如果省略逗号,显示的文本每行后会有两个换行符,一个是输入附带的,另一个是print自动添加的。


操作系统间的差异之一是它们所支持的行分隔符不同。但python设计者已经考虑到了这个问题。所以,不管使用什么平台,只要导入了os模块,这些变量会自动被设置为正确的值,减少了开发者的麻烦。


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()


由于raw_put()不会保留用户输入的换行符,调用write()方法时必须加上换行符。


file.next() 返回文件的下一行。没有其他行时将会引发stopiteration异常。


file.closed表示文件已经被关闭,否则为False。


标准文件


一般来说,只要你的程序一执行,你就可以访问3个标准文件。它们分别是标准输入、标准输出和标准错误。这些文件分别为stdin,stdout和stderr,它们已经预先被打开了,可以随时访问这些文件。

python中可以通过sys模块来访问这些文件的句柄。导入sys模块后,就可以使用sys.stdin、sys.stdout和sys.stderr访问。print语句通常输出到sys.stdout。而内建raw_input()则通常从sys.stdin接收输入。


记住,sys.*是文件,所以必须要处理好换行符。而print语句会自动在要输出的字符串后加上换行符。


命令行参数


sys.argv是命令行参数的列表

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


各个程序的输出一般是不保存的,这样可以节省大量的磁盘空间,各个程序的输出通常使用“管道”实现到下个程序输入的转换。


python还提供两个模块来辅助处理命令行参数。其中一个是getopt模块,比较简单,不是很精细。另一个是optparse模块,它面向对象,也更复杂。


文件系统


对文件系统的访问大多通过python的os模块实现。os模块实际上只是真正加载的模块的前端。只要导入os模块,python会自动选择正确的底层模块。根据系统支持的特性,可能无法访问到一些在其他系统上可用的属性。


除了对进程和进程运行环境进行管理外,os模块还负责处理大部分的文件系统操作。这些功能包括删除/重命名文件,遍历目录树,以及管理文件访问权限等。


os.path可以完成一些针对路径名的操作。它提供的函数可以完成管理和操作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等操作。


永久存储模块


python提供了许多可以实现最小化永久性存储的模块。其中marshal和pickle可以用来转换并存储python对象。该过程将比基本类型复杂的对象转换为一个二进制数据集合,这样就可以把数据集合保存起来或通过网络发送,然后再重新把数据集合恢复原来的对象格式。


marshal只能处理简单的python对象,而pickle还可以处理递归对象,被不同地方多次引用的对象,以及用户定义的类和实例。


pickle模块回创建一个python语言专用的二进制格式,你不需要考虑任何文件细节,它会干净利索地完成读写对象操作。pickle模块中的两个主要函数是dump()和load()。dump()函数把数据对象以特定格式保存到给定文件里。load()函数从文件中取出已保存的对象。


在使用*db*系列的模块时,如果不确定的话,最好使用anydbm模块,会自动检测系统上已安装的DBM兼容模块,并选择‘最好’的一个。

dumbdbm模块是功能最少的一个,在没有其他模块可用时,anydbm才会选择。不足之处是只能存储字符串,不能堆python对象进行序列化。


shelve模块允许对数据库文件进行并发的读访问,但不允许共享读/写访问。这是在python标准库里最接近永久性储存的东西了。不必用读模式或者写模式打开,因为它们打开后,既能读又能写。












本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1960328,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小美
+ 关注