您的位置:首页 > 编程语言 > Python开发

Python基础教程 第11章: 文件和流 学习笔记

2015-12-23 14:15 666 查看
本文部分内容转载于:

http://www.runoob.com/python/python-files-io.html

http://docs.pythontab.com/python/python2.7/inputoutput.html#tut-files

打开文件:

你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写。
语法:


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


各个参数的细节如下:


file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。


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


r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。


File对象的属性:


一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。



#打开文件
f = open("1.txt", "r+")

#文件名称
print f.name
#文件是否被关闭
print f.closed
#文件打开的模式
print f.mode



1.txt
False
r+


关闭文件:


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


写文件:


Write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
Write()方法不在字符串的结尾不添加换行符('\n')


读文件:


read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
语法:
fileObject.read([count])
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。


文件位置:


Tell()方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。



#打开文件
f = open("1.txt", "r+")

#写入文件内容
f.write("Hello\r\n")
f.write("Hello")

#获取当前文件指针位置
print f.tell()

#移动文件指针到文件头
f.seek(0)

#获取当前文件指针位置
print f.tell()

#读取文件内容
print f.read()

f.seek(0)
print f.read(3)

#关闭文件
f.close()



13
0
Hello
Hello
Hel


读写行:


file.readline: 读取单独的一行(从当前的位置开始直到一个换行符出现),不使用任何参数(一行就被读取和返回),或使用一个非负的整数作为readline可以读取字符的最大值。

file.writelines: 传给它一个字符串的列表(实际上任何序列或者可迭代的对象都行),它会把所有的字符串写入文件。注意,程序不会增加新行,需要自己添加。


提交缓存数据到文件:

with open("1.txt", "r+") as f:
i = 0
while True:
f.write("zzzzzzzz")
#提交缓存数据到文件
f.flush()
i += 1
if i > 10:
break


推荐写法:

try:
f = open("1.txt", "r+")

print f.readline()
finally:
f.close()


第二种推荐写法:

#with语句可以打开文件并且将其赋值到变量somefile上,之后就可以将数据写入语句体中的文件。
#文件在语句结束后会被自动关闭,即便是由于异常引起的结束也是如此。
with open("1.txt") as somefile:
print somefile.readline()


对文件内容进行迭代:除了使用上面read方法对文件内容进行读取,还可以通过另外一些方法对文件的内容进行迭代

with open("1.txt", "r+") as f:
#使用read迭代每个字符
for char in f.read():
print char


with open("1.txt", "r+") as f:
#使用readlines迭代行
for line in f.readlines():
print line


在需要对一个非常大的文件进行行迭代的操作时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法来替代,还可以使用for循环用一个名为懒惰行迭代的方法:

import fileinput

#之所以说它懒惰是因为它只是读取实际需要的文件部分
for line in fileinput.input("1.txt"):
print line


还有一种内容迭代的方法叫做 文件迭代器,在Python2.2开始,文件对象是可迭代的:

with open("1.txt", "r") as f:
for line in f:
print line


pickle 模块:

我们可以很容易的读写文件中的字符串。数值就要多费点儿周折,因为 read() 方法只会返回字符串,应该将其传入 int() 这样的方法中,就可以将 '123' 这样的字符转为对应的数值 123。不过,当你需要保存更为复杂的数据类型,例如列表、字典,类的实例,事情就会变得更复杂了。

好在用户不必要非得自己编写和调试保存复杂数据类型的代码。 Python 提供了一个名为 pickle 的标准模块。这是一个令人赞叹的模块,几乎可以把任何 Python 对象 (甚至是一些 Python 代码段!)表达为为字符串,这一过程称之为封装 ( pickling )。从字符串表达出重新构造对象称之为拆封( unpickling )。封装状态中的对象可以存储在文件或对象中,也可以通过网络在远程的机器之间传输。

如果你有一个对象 x ,一个以写模式打开的文件对象 f ,封装对象的最简单的方法只需要一行代码:

pickle.dump(x, f)


如果 f 是一个以读模式打开的文件对象,就可以重装拆封这个对象:

x = pickle.load(f)


(如果不想把封装的数据写入文件,这里还有一些其它的变化可用。完整的 pickle 文档请见Python 库参考手册)。

pickle 是存储 Python 对象以供其它程序或其本身以后调用的标准方法。提供这一组技术的是一个 持久化 对象( persistent object )。因为 pickle 的用途很广泛,很多 Python 扩展的作者都非常注意类似矩阵这样的新数据类型是否适合封装和拆封。

import pickle

l = [1, 2, 3, 4]
d = {"name":"zhangsan", "age": "22", "phone":"110"}

with open("1.txt", "r+") as f:
#写入列表
pickle.dump(l, f)
f.write("\r\n")
#写入字典
pickle.dump(d, f)

'''
写入文件后的结构:

(lp0
I1
aI2
aI3
aI4
a.

(dp0
S'phone'
p1
S'110'
p2
sS'age'
p3
S'22'
p4
sS'name'
p5
S'zhangsan'
p6
s.
'''

with open("1.txt", "r") as f:
#读取列表数据
l1 = pickle.load(f)
f.readline()
#读取字典数据
d1 = pickle.load(f)

print l1
print d1



[1, 2, 3, 4]
{'phone': '110', 'age': '22', 'name': 'zhangsan'}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: