python之文件操作

文件

对于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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值