文件
对于python来讲,内置open函数会创建一个python文件对象,可以作为计算机上的一个文件链接。在调用open之后,你可以通过返回的文件对象的方法来读写相关的外部文件。
常见文件运算
output = open(r'c:\spam', 'w') 创建输出文件 w写入
input = open('data, 'r'')创建输入文件 r指读写
input = open('data')与上一行相同,默认 r
str = input.read()读文件读进单个字符
str = input.read(N)读取之后的N个字节
str = input.readline()读取下一行
list = input.readlines()读取整个文件到字符串列表
output.write(str)写入字符串到文件
output.writelines(list)把列表所有字符串写入文件
output.close()手动关闭(文件收集完也会自动关闭,但是手动是个好习惯)
output.flush()把缓冲区内容刷到硬盘中
anyFile.seek(N)修改文件位置N以便进行下一个操作
for line in open('data')文件迭代器一行一行地读取
open('f.txt', encoding='latin-1')python 3.0 unicode文本文件(str字符串)
open('f.bin', 'rb')python3.0 二进制byte文件(bytes字符串)
打开文件
open函数参数,首先是外部文件名,然后是处理模式(r输入打开文件,w输出打开文件,a文件尾部追加内容打开文件,b二进制处理数据,+同时为输入输出打开文件)
open前两个参数必须是字符串,第三个是可选参数,可以控制输出缓存,传“0”意味着输出无缓存。第一个参数文件名称可以包含绝对路径或相对路径,默认当前目录
使用文件
文件迭代器是最好的读取行工具(读写方法较多,但是迭代器比较好,比较省内存,效率高)
内容是字符串不是对象(读出的都是字符串,如果不是你需要的需要转成对应的对象,比如 int float str)
close是通常选项(python会自动回收,但是调用cloe是个好习惯)
文件是缓冲的并且是可查找的(close会将缓存写到硬盘,flush也可以,也可以指定额外参数不需要缓冲;python文件字节偏移支持随机访问,可以跳转到指定位置)
实际应用
注意write要手动写入换行终止符,否则就是连续写
>>> myfile=open('myfile.txt','w')
>>> myfile.write('hello txt file\n')
>>> myfile.write('goodbye txt file\n')
>>> myfile.close()
>>>
>>> myfile=open('myfile.txt')
>>> myfile.readline()
'hello txt file\n'
>>> myfile.readline()
'goodbye txt file\n'
>>> myfile.readline()
''
>>> open('myfile.txt').read()
'hello txt file\ngoodbye txt file\n'
>>> print(open('myfile.txt').read())
hello txt file
goodbye txt file
>>> for line in open('myfile.txt'):
... print line #print会自动换行
...
hello txt file
goodbye txt file<span style="white-space:pre"> </span>
文本和二进制文件
文本文件是把内容视为常规的str字符串,自动执行unicode编码和解码,并且默认执行末行转换
二进制文件把内容表示一个特殊的bytes字符串类型,并且允许程序不修改地访问文件
在文件中存储并解析python对象
>>> X,Y,Z=43,44,45
>>> S='spam'
>>> D={'a':1,'b':2}
>>> L=[1,2,3]
>>>
>>> F=open('data.txt', 'w')
>>> F.write(S+'\n')
>>> F.write('%s,%s,%s\n' %(X, Y, Z))
>>> F.write(str(L) + '$' + str(D) + '\n')
>>> F.close()
>>>
>>> chars = open('data.txt').read()
>>> chars
"spam\n43,44,45\n[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> print chars
spam
43,44,45
[1, 2, 3]${'a': 1, 'b': 2}
>>>
>>> F = open('data.txt')
>>> line = F.readline()
>>> line
'spam\n'
>>> line.rstrip() #去掉最后字符
'spam'
>>> line = F.readline()
>>> line
'43,44,45\n'
>>> parts = line.split(',') #split切分
>>> parts
['43', '44', '45\n']
>>> int(parts[0])
43
>>> numbers = [int(p) for p in parts]
>>> numbers
[43, 44, 45]
>>> line = F.readline()
>>> line
"[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> parts = line.split('$')
>>> parts
['[1, 2, 3]', "{'a': 1, 'b': 2}\n"]
>>> eval(parts[0])
[1, 2, 3]
>>> objects = [eval(P) for P in parts] #eval能够把字符串当做可执行程序代码
>>> objects
[[1, 2, 3], {'a': 1, 'b': 2}]
pickle存储python原生对象
使用eval可以把字符串转换成对象,它是个很强大的工具,但是过于强大,eval会执行python的任何表达式,甚至可能删除计算机上的文件,需要给与必要的权限。如果真想存储原生对象,但又无法相信文件的数据来源,python标准库的pickle模块会是个理想的选择。
pickle模块是能够让我们直接在文件中存储任何python对象的高级工具。
>>> D = {'a': 1, 'b': 2}
>>> F = open('data.pkl', 'wb')
>>> import pickle
>>> pickle.dump(D, F)
>>> F.close()
>>>
>>> F = open('data.pkl', 'rb')
>>> E = pickle.load(F)
>>> E
{'a': 1, 'b': 2}
文件中打包二进制数据的存储和解析
有些高级应用程序也需要处理打包的二进制数据,这些数据可能是c语言程序生成的。python的标准库中包含一个能够在这一范围起作用的工具:struct模块能够钩子并解析打包的二进制数据。从某种意义上说,他是另一个数据转换工具,它能够吧文件中的字符串解读为二进制数据
>>> F = open('data.bin', 'wb')
>>> import struct
>>> data = struct.pack('>i4sh', 7, 'spam', 8)
>>> data
'\x00\x00\x00\x07spam\x00\x08'
>>> F.write(data)
>>> F.close()
>>> F = open('data.bin', 'rb')
>>> data = F.read()
>>> data
'\x00\x00\x00\x07spam\x00\x08'
>>> values = struct.unpack('>i4sh', data)
>>> values
(7, 'spam', 8)
其他文件工具
标准流-sys模块,如sys.stdout
os模块中的描述文件- 处理整数的文件,支持如文件锁定之类的较低级工具
socket piple FIFO
通过键来存取文件
shell命令流 os.popen