码迷,mamicode.com
首页 > 编程语言 > 详细

python学习之路19-文件IO

时间:2015-05-18 10:52:55      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:python

  本篇博客将介绍Python的文件处理和相关输入输出,将涉及到文件对象(它的内建函数,内建方法和属性),标准文件和文件系统的访问方法,文件执行.(欢迎大家去我的新博客走走)

文件对象

  文件对象不仅可以用来访问普通的磁盘文件,也可以访问任何其他类型抽象层面上的”文件”.内建函数open()返回一个文件对象,对文件进行后续相关的操作都要用到它.

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


  作为钥匙,内建函数open()和file()提供了初始化输入/输出(I/O)操作的通用接口.open()函数成功打开文件后会返回一个文件文件对象,若不成功,则抛出一个IOError异常.open()函数的语法如下:
file_object = open(file_name, access_mode="r", buffering=-1)
  file_name 是将要打开文件的文件名,可以是相对路径或绝对路径.access_mode也是一个字符串,代表打开文件的模式,有”r”(代表读取),”w”(代表写入),”a”(代表追加).以”r”模式打开的文件必须是存在的.以”w”模式打开文件,若文件不存在则会创建,若文件已存在,则将该文件清空在写入数据.”a”模式和”w”类似,唯一的区别就是”a”是在文件的末尾添加数据的,不会清空文件原来存在的数据.若文件不存在,则创建它.access_mode默认为”r”.buffering用于指示访问文件所采用的缓冲方式.其中0表示不缓冲,1表示只缓冲一行数据,任何其他大于1的数值代表使用给定值作为缓冲区大小.不提供该参数或给负值代表使用系统默认的缓冲机制.更详细的看下图:
技术分享

文件内建方法

  open()成功执行并返回一个文件对象之后,所有对该文件的后续操作都将通过这个句柄进行.文件方法有4类:输入, 输出, 文件内移动及迭代操作.

输入

  read()方法用来直接读取字节到字符串中,最多读取给定数目个字节.如何没有给定size参数(默认为-1)或者size值为负,文件将被读取直到末尾.
  readline()方法读取文件一行,然后整行(包括行结束符),作为字符串返回.和read()方法类似,它也有一个可选的size参数,默认为-1,代表读到行结束.如果提供了该参数,例如5吧,则它只会读取该行的5个字符.
  readlines()方法不像其他两个方法返回一个字符串.他会读取所有(剩余的)行然后把他们他们作为一个字符串列表返回.它的可选参数sizhint代表返回的最大字节大小.如果它大于0,那么返回的所有行应该有sizeint字节.

输出

  wirte()内建方法的功能与read()和readline()相反.它把含有文本数据或二进制数据块的字符串写入到文件中去.
  和 readlines()一样, writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将他们写入文件中.但是行结束符不会自动加入,如果需要,你必须在调用writelines()钱给每行结尾加上行结束符.

文件内移动

  seek()方法(类似与C中的fseek()函数)可以在文件中移动文件指针到不同的位置.offset字节代表相对于某个位置偏移量.位置的默认值为0,代表从文件开头算起(即绝对偏移量),1代表从当前位置算起, 2代表从文件末尾算起.
  tell()方法是对seek()方法的补充;它告诉你当前文件指针在文件中的位置–从文件起始算起,单位为字节.

文件迭代

  文件迭代让程序员访问文件是如此简单:

f = open("test.txt", "r")
for eachLine in f:
    print eachLine

其他

  close()通过关闭文件来结束对它的访问.
  fileno()方法返回打开文件的描述符.这是一个整数
  调用flush()方法会直接把内部缓冲区中的数据立刻写入文件,而不是被动的等待输出缓冲区被写入.

是时候大干一票了

  上面扯了这么多,还是动手实践直观些,来写一些demo

>>> f = open("test", "r")
>>> fileno(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name ‘fileno‘ is not defined
>>> f.fileno()
3
>>> f.tell()
0
>>> for eachLine in f:
...     print eachLine,
... 
This file just for test.
line 1
line 2@
line 3!
line 4*


end!!!
>>> f.tell()
65
>>> f.seek(0,0)
>>> f.tell()
0
>>> 
>>> f = open("newfile", "w")
>>> f.write("This is a test")
>>> f.tell()
14
>>> f.writelines(["line1", "line2", "line3"])
>>> f.close()
>>> f = open("newfile", "r")
>>> for eachLine in f:
...     print eachLine,
... 
This is a testline1line2line3
>>> 

文件内建属性

  文件对象除了方法之外,还有一些数据属性.这些属性保存了文件对象相关的附加数据.

文件对象的属性 描述
file.closed 表示文件以关闭
file.encodeing 文件所使用的编码
file.mode 文件打开时的访问模式
file.name 文件名
file.newline 为读取到行结束符是为None,只有一种行结束符是为一个字符串,当文件有多种行分隔符时,则为一个包含所有当前所遇到的行结束符的列表

标准文件

  标准文件有这3个:标准输入, 标准输出, 标准错误
  Python中可以通过sys模块来访问这些文件的句柄.sys.stdin, sys.stdout, sys.error分别代表标准输入, 标准输出, 标准错误.通常来说,print语句是输出到sys.stdout, raw_input()是从sys.stdin接收输入.

命令行参数

  相信熟悉C语言的同学对命令行参数比较熟悉,在C语言中,argc和argv分别代表参数个数和参数向量.argv变量代表从一个命令行上输入的各个参数组成的字符串数组;argc变量代表输入的参数个数.在Python中,argc是不存在的.Pyhton中的sys.argv相当与C的argv,而len(sys.argv)才相当于C中的argc.总之:
- sys.argv 是命令行参数的列表
- len(sys.argv) 是命令行参数的个数

  看一个小例子:

##argvTest.py
import sys

print "you entered", len(sys.argv), "arguments..."
print "they were: ", str(sys.argv)
likai@likai:~/python$ python argvTest.py 43 test 44.44 haha
you entered 5 arguments...
they were:  [‘argvTest.py‘, ‘43‘, ‘test‘, ‘44.44‘, ‘haha‘]

文件系统

  对文件系统的访问大多通过Python的os模块实现.该模块是Python访问操作系统功能的主要接口.os模块实际是只是真正加载的模块的前端,而具体的实现则依赖于具体的操作系统.
  os模块可以对进程和进程运行环境进行管理,os模块还负责大部分的文件系统操作.当然本篇博客主要讲os的文件系统操作..这些操作包括删除/重命名文件,遍历目录树,以及管理文件权限等.
  另一个模块os.path 可以完成一些针对路径名的操作.它提供的函数可以完成管理和操作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等功能.

os模块的文件/目录访问函数

函数 描述
文件处理
mkfifo()/mknod() 创建命名管道/创建文件节点
remove()/unlink() 删除文件
rename()/renames() 重命名文件
stat() 返回文件信息
sysmlink() 创建符号链接
utime() 更新时间戳
tmpfile() 创建病打开(‘w+b’)一个新的临时文件
walk() 生成一个目录树下的所有文件名
目录/文件夹
chdir() 改变当前工作目录
chroot() 改变当前进程的根目录
getcwd() 返回当前工作目录
mkdir()/mkdirs() 创建目录/多层目录
rmdir()/rmdirs() 删除目录/多层目录
访问/权限
access() 检验权限
chmod() 改变权限
chown() 改变owner
umask() 设置默认权限
文件描述符操作
open() 底层的操作系统open
read()/write() 读取/写入数据
dup()/dup32() 复制文件描述符/功能相同,但是复制到另一个文件描述符
设备号
makedev() 从major和minor设备号创建一个原始设备号
major()/minor() 从原始设备号获得major/minor设备号

os.path模块中的路径名访问函数

函数 描述
分隔
basename() 去掉目录路径, 返回文件名
dirname() 去掉文件名,返回目录路径
join() 将分离的各部分组成一个路径名
split() 返回(dirname(), basename())元组
splitdrive() 返回(dirvename, pathname)元组
splitext() 返回(filenameextension)元组
信息
getatime() 返回最近访问时间
getctime() 返回文件创建时间
getmtime() 返回文件修改时间
getsize() 返回文件大小
查询
exists() 指定路径是否存在
isabs() 指定路径是否为绝对路径
isdir() 指定路径是否存在且为一个目录
isfile() 指定路径是否存在且为一个文件
islink() 指定路径是否存在且为一个符号链接
ismount() 指定路径是否存在且为一个挂载点
samefile() 两个路径名是否指向同一个文件

end

  最后用Python核心编程的一个例子结束本篇博客

#!/usr/bin/env python

import os
for tmpdir in (‘/tmp‘, ‘c:/windows/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...‘
    file = open(‘test‘, ‘w‘)
    file.write(‘foo\n‘)
    file.write(‘bar\n‘)
    file.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.splitext(os.path.basename(path))

    print ‘*** displaying file contents:‘
    file = open(path)
    allLines = file.readlines()
    file.close()
    for eachLine in allLines:
    print eachLine,

    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‘

输出结果(linux)

likai@likai-Lenovo-G490:~/python$ python ospathex.py 
*** current temporary directory
/tmp
*** creating example directory...
*** new working directory:
/tmp/example
*** original directory listing:
[]
*** creating test file...
*** updated directory listing:
[‘test‘]
*** renaming ‘test‘ to ‘filetest.txt‘
*** updated directory listing:
[‘filetest.txt‘]
*** full file pathname:
/tmp/example/filetest.txt
*** (pathname, basename) == 
(‘/tmp/example‘, ‘filetest.txt‘)
*** (filename, extension) == 
(‘filetest‘, ‘.txt‘)
*** displaying file contents:
foo
bar
*** deleting test file
*** updated directory listing:
[]
*** deleting test directory
*** DONE

python学习之路19-文件IO

标签:python

原文地址:http://blog.csdn.net/u012088213/article/details/45816109

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!