找回密码
 注册
关于网站域名变更的通知
查看: 347|回复: 1
打印 上一主题 下一主题

给深度学习入门者的Python快速教程基础篇之文件操作和pickle

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-15 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
文件操作和pickle4 N/ @6 s3 g/ p, [; X- s  `: _* j# Z

) j- [6 Z( e/ S! L; z; u在Python中,推荐用上下文管理器(with-as)来打开文件,IO资源的管理更加安全,而且不用老惦记着给文件执行close()函数。还是举例子来说明,考虑有个文件name_age.txt,里面存储着名字和年龄的关系,格式如下:8 |  X2 d* S. ^2 O3 j2 p! s
Tom,8
* U, a- [& u' e7 gJerry,72 p0 k8 o; c  ]! t/ R' b
Tyke,32 i* f/ s0 b7 `, m& @8 l* g
...+ q, t3 T% ]  R- q

8 w4 y1 o2 I5 T$ n1 n读取文件内容并全部显示:
$ a/ V8 K6 V$ F* O2 N" D4 k% Cwith open('name_age.txt', 'r') as f: # 打开文件,读取模式
2 D: h* ^1 ?; X4 M/ D% T1 \0 }lines = f.readlines() # 一次读取所有行
0 u8 |8 |9 n* P( ofor line in lines: # 按行格式化并显示信息3 P4 i5 I! w3 |' {4 ~1 H$ C
name, age = line.rstrip().split(',')' Y/ P  ?3 ^+ j! o# G
print('{} is {} years old.'.format(name, age))9 {6 z! ~" t- ~. e8 }5 e8 u

% V/ @- W9 K/ Q) C3 xopen()的第一个参数是文件名,第二个参数是模式。文件的模式一般有四种,读取(r),写入(w),追加(a)和读写(r+)。如果希望按照二进制数据读取,则将文件模式和b一起使用(wb, r+b…)。
- i5 ~8 v' @, r& o' X3 ^- s  z+ Y0 {; e, T7 E# g, R4 M5 C
再考虑一个场景,要读取文件内容,并把年龄和名字的顺序交换存成新文件age_name.txt,这时可以同时打开两个文件:
- `" {( y/ m5 w% z9 B/ ewith open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite:
  ^" A8 ~7 G1 t6 Rline = fread.readline()5 k) w4 p0 l4 E1 O, K
while line:. K" z7 r0 _$ a: G, P/ h5 f; s
name, age = line.rstrip().split(',')
& ^; }) ?# l0 [! B" [fwrite.write('{},{}\n'.format(age, name))
4 f: i% S& j: i" E3 N; I0 Dline = fread.readline()
& i8 J9 ?% l) r9 z! n
+ m# ?+ o! H9 {有的时候我们进行文件操作是希望把对象进行序列化,那么可以考虑用pickle模块:
3 o0 K" V, |8 Dimport pickle
5 r- O6 o4 i; h( m6 h
' v. s. i& k/ d0 }3 n$ Z2 U3 H! Mlines = [
1 A# h2 \% ?& z8 ~, J+ O"I'm like a dog chasing cars.",
9 U; t. I) b0 V3 |' V5 k  K" `"I wouldn't know what to do if I caught one...",
. E- @9 W1 F' O& s3 h( a"I'd just do things."
9 L- C3 n' ^% F1 E4 W1 q, G7 {7 |]
# D# _0 g* c% {, O# ]3 D6 C5 g
: v1 ?3 N: X7 J0 c3 s; y) {* S9 ]4 [with open('lines.pkl', 'wb') as f: # 序列化并保存成文件
4 z1 a: b9 D  apickle.dump(lines, f): w+ }4 E8 ?7 V) A8 c! ~
! S: z* e2 g4 [8 r5 X1 S0 ~
with open('lines.pkl', 'rb') as f: # 从文件读取并反序列化
" ~8 [2 e0 _* [, L3 a% j! dlines_back = pickle.load(f)2 |: Z6 ^4 O: z4 H' b

; s* f2 U  P5 K! u! D. q/ R  Lprint(lines_back) # 和lines一样
% w6 o* f8 X5 B" ~2 {- [
$ H) I7 ?5 k+ T% ~3 v注意到,序列化的时候就得使用b模式了。Python2中有个效率更高的pickle叫cPickle,用法和pickle一样,在Python3中就只有一个pickle。
6 s6 n! ^$ q8 z3 Q( ^) t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-6 13:33 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表