打开和关闭文件:

可以用 file 对象做大部分的文件操作。

open 函数:

先用open()函数打开一个文件,创建一个file对象,再用相关的方法才可以调用它进行读写。
open() 和 file() 功能相同, 可以任意替换。
任何使用 open() 的地方, 都可以使用 file() 替换它,建议用open()

语法:

file object = open(file_name [, access_mode][, buffering]) 

参数说明:

file_name:      
file_name变量是一个包含了你要访问的文件名称的字符串值。

access_mode:
决定打开文件的模式:只读,写入,追加等,所有可取值见后面的完全列表,这个参数是非强制的
默认文件访问模式为只读(r).通常, 文件使用模式 'r', 'w', 或是 'a'模式来打开, 分别代表读取, 写入
和追加

buffering:         
    如果buffering的值被设为0,就不会有寄存。
    如果buffering的值取1,访问文件时会寄存行。
    如果将buffering的值设为大于1的整数,表明这就是的寄存区的缓冲大小。
    如果取负值,寄存区的缓冲大小则为系统默认。

    例1.
    >>> f = open('c.txt','w',0)     #没有缓冲
    >>> f.write('hello world')       #close之前打开另一终端观察文件发现已经写入进
                                                     去,说明关闭文件之前就已经写到硬盘
    >>> f.close()

    例2.    
    >>> f = open('d.txt','w',1)     #有缓冲
    >>> f.write('hello world')       #close之前打开另一终端观察文件发现没有写入进 
                                                    去,说明关闭文件之前没有写到硬盘
    >>> f.close()

    例3.   
    >>> f = open('e.txt','w',5)     #设置缓冲区大小,wing发现没有管用,跟没有缓冲
                                                    效果是一样的
    >>> f.write('hello world')

    例4.   
    >>> f = open('f.txt','w',-1)     #设置缓存区大小为默认,发现有缓冲
    >>> f.write('hello world')
    >>> f.close()
    一般情况下缓冲使用系统默认方式即可.

不同模式打开文件的完全列表:

| 模式 | 描述 |
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。以这种模式打开的文件必须是已经存在的(U模式也是) |
| rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
| r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。注意这个模式默认是带缓冲的 |
| rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
| w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
| wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
| w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
| wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后即使你 seek 到了其它的地方。如果该文件不存在,创建新文件进行写入。 |
| ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
| ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |

通用换行符支持(UNS):

 还有一个特殊的模式U,不同平台用来表示行结束的符号是不同的, 例如 \n, \r, 或者 \r\n.当你使用 'U' 标志打开文件的时候, 所有的行分割符(或行结束符, 无论它原来是什么)通过 Python 的输入方法(例如 read*() )返回时都会被替换为换行符 NEWLINE(\n).注意 UNS 只用于读取文本文件. 没有对应的处理文件输出的方法.
 可以使用U,rU或Ua模式打开文件

关于 'b' 的说明:

对于所有 POSIX 兼容的 Unix 系统(包括Linux)来说, 'b'是可由可无的, 因为它们把所有的文件当作二进制文件, 包括文本文件. 
下面是从 Linux 手册的 fopen() 函数使用中摘录的一段, Python 语言中的 open() 函数就是从它衍生出的:
指示文件打开模式的字符串中也可以包含字符 "b" , 但它不能做为第一个字符出现.
这样做的目的是为了严格地满足 ANSI C3.159-1989 (即 ANSI C)中的规定。
事实上它没有任何效果, 所有POSIX 兼容系统, 包括 Linux , 都会忽略 "b" ,其它系统可能会区分文本文件和二进制文件, 如果你要处理一个二进制文件, 并希望你的程序可以移植到其它非 Unix 的环境中, 加上"b" 会是不错的主意

File对象的属性

一个文件被打开后,你就会拥有一个file对象,你可以得到有关该文件的各种信息。

file对象属性列表:

| 属性 | 描述 |
| file.closed | 返回true如果文件已被关闭,否则返回false。 |
| file.mode | 返回被打开文件的访问模式。 |
| file.name | 返回文件的名称。 |
| file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。一般程序员用不着,由程序内部使用。 |

例:

#!/usr/bin/python
#打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace 

输出结果: 
文件名:  foo.txt
是否已关闭 :  False
访问模式 :  w
末尾是否强制加空格 :  0

close()方法:

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。 
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件

语法: 
    fileObject.close() 
例: 
    #!/usr/bin/python
    fo = open("foo.txt", "w")
    print "文件名: ", fo.name    
    fo.close()      # 关闭打开的文件

    输出结果: 
    文件名:  foo.txt   

读文件方法: read() readline() readlines()

read():返回字符串

从一个打开的文件中读取一个字符串。
fileObject.read([count])
    被传递的参数count是要从已打开文件中读取的字节计数。
该方法从文件的开头开始读入,如果没有传入count参数(默认值为 -1)或者值为负, 文件将被
读取到末尾.

 #!/usr/bin/python
 fo = open("foo.txt", "r+")
 str = fo.read(10);
 print "读取的字符串是 : ", str
 fo.close() 

 输出结果: 
 读取的字符串是 :  www.fklinu

readline():返回字符串

读取下个行结束符之前的所有字节. 作为字符串返回整行,包括行结束符。
和 read() 相同, 它也有一个可选的 size 参数, 默认为 -1, 代表读至行结束符, 如果
提供了该参数, 那么在超过 size 个字节后会返回不完整的行.

readlines():返回字符串列表

读取所有剩余的行,返回一个字符串列表。

写文件方法:write() writelines()

write()

可将任何字符串(包括二进制数据)写入一个打开的文件,不会在字符串的结尾添加换行符('\n')

writelines()

是针对列表的操作, 它接受一个字符串序列(字符串,字符串列表,字符串元组)作为参数, 将它们写入文件. 行结束符并不会被自动加入, 所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行结束符.

语法:
fileObject.write(string)
string参数是要写入到已打开文件的内容。

 #!/usr/bin/python
 fo = open("foo.txt", "w")
 fo.write( "www.fklinux.com!\nVery good site!\n");    
 fo.close() # 关闭打开的文件

被创建的foo.txt文件内容: 
 # cat foo.txt 
 www.fklinux.com!
 Very good site!

文件内移动:

tell()方法:

这个方法告诉我们文件内的当前位置,换句话说,下一次的读写会发生在文件开头这么多字节之
后。 

seek()方法:

可以在文件中移动文件指针到不同的位置. 
语法:
seek(offset [,from])

offset变量表示要移动的字节数
from变量指定开始移动字节的参考位置。 
    如果from被设为0,这意味着将文件的开头作为移动字节的参考位置
    如果设为1,则使用当前的位置作为参考位置
    如果设为2,那么该文件的末尾将作为参考位置 

seek配置r+模式可以实现从指定位置修改文件 

例:
就用上面创建的文件foo.txt。
#!/usr/bin/python
fo = open("foo.txt", "r+")
str = fo.read(10);
print "读取的字符串是 : ", str

 # 查找当前位置
 position = fo.tell();
 print "当前文件位置 : ", position

 # 把指针再次重新定位到文件开头
 position = fo.seek(0, 0);
 str = fo.read(10);
 print "重新读取字符串 : ", str
 # 关闭打开的文件
 fo.close() 

 输出结果: 
 读取的字符串是 :  www.fklinu
 当前文件位置 :  10
 重新读取字符串 :  www.fklinu

文件迭代:
一行一行访问文件很简单:
for eachLine in f:
:

此循环里, eachLine 代表文本文件的一行(包括末尾的行结束符),你可以使用它做任何想做的事情.
在 Python 2.2 中, 引进了迭代器和文件迭代,  文件对象成为了它们自己的迭代器
意味着用户不必调用 read*() 方法就可以在 for 循环中迭代文件的每一行.
另外也可使用迭代器的 next 方法, file.next() 可以用来读取文件的下一行.
和其它迭代器一样, Python 也会在所有行迭代完成后引发 StopIteration 异常.

迭代器之前的老方法:
for eachLine in f.readline():
    :

其他:

flush() 方法
会直接把内部缓冲区中的数据立刻写入文件, 而不是被动地等待输出缓冲区被写入.
truncate() 方法
将文件截取到当前文件指针位置或者到给定 size , 以字节为单位.
它接受一个可选的 size 作为参数. 如果给定, 那么文件将被截取到最多 size 字节处. 如果没有传递 size 参数, 那么默认将截取到文件的当前位置.例如, 你刚打开了一个文件, 然后立即调用 truncate() 方法, 那么你的文件(内容)实际上被删除,这时候你是其实是从 0 字节开始截取的

重命名和删除文件

Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。

rename()方法:
需要两个参数,当前的文件名和新文件名。
语法:
os.rename(current_file_name, new_file_name)

例子: 下例将重命名一个已经存在的文件test1.txt。
#!/usr/bin/python
import os
os.rename( "test1.txt", "test2.txt" ) # 重命名文件test1.txt到test2.txt。

remove()方法:
你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
语法:
os.remove(file_name)

例子: 下例将删除一个已经存在的文件test2.txt。
#!/usr/bin/python
import os
os.remove("test2.txt") # 删除一个已经存在的文件test2.txt

Python里的目录:

os模块有许多方法能帮你创建,删除和更改目录。

mkdir()方法:
使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
语法:
os.mkdir("newdir")
例子: 下例将在当前目录下创建一个新目录test。
#!/usr/bin/python
import os
os.mkdir("test") # 创建目录test

chdir()方法:
可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
语法:
os.chdir("newdir")
例子: 下例将进入"/home/newdir"目录。
#!/usr/bin/python
import os
os.chdir("/home/newdir") # 将当前目录改为"/home/newdir"

getcwd()方法:
getcwd()方法显示当前的工作目录。
语法:
os.getcwd()
例子: 下例给出当前目录:
#!/usr/bin/python
import os
os.getcwd() # 给出当前的目录

rmdir()方法 :
rmdir()方法删除目录,目录名称以参数传递。 在删除这个目录之前,它的所有内容应该先被清除。
语法:
os.rmdir('dirname')
例子: 以下是删除" /tmp/test"目录的例子,目录的完全合规名称必须被给出,否则会在当前目录下搜索该目录。
#!/usr/bin/python
import os
os.rmdir( "/tmp/test" ) # 删除”/tmp/test”目录