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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
文件操作和pickle
, `. `0 G, b* X
, c" e: Z4 u- S5 }2 V- S% H在Python中,推荐用上下文管理器(with-as)来打开文件,IO资源的管理更加安全,而且不用老惦记着给文件执行close()函数。还是举例子来说明,考虑有个文件name_age.txt,里面存储着名字和年龄的关系,格式如下:
5 A- z- q* \+ h9 S$ j  c2 P7 NTom,8
1 q5 _; f1 S9 g* f7 ]* u3 ^4 ?Jerry,7
' c7 U4 q4 z$ fTyke,3, p5 `0 F# Q8 K! W
...- ]. t3 M# y. x  G

: e8 S+ Y! ]) {' c读取文件内容并全部显示:
( y, M% d" h8 u0 j# L8 q% Z- Ywith open('name_age.txt', 'r') as f: # 打开文件,读取模式" T( r) Q$ o, q+ U' O
lines = f.readlines() # 一次读取所有行# k  p' a$ c2 v3 t+ z7 x  ?
for line in lines: # 按行格式化并显示信息6 p" Q9 Y3 e% {
name, age = line.rstrip().split(',')& h; S/ i/ g0 I$ H7 w9 x
print('{} is {} years old.'.format(name, age))( \% F! D2 P3 M  B

" f$ l7 j% r  ^' h6 z7 u0 |6 `open()的第一个参数是文件名,第二个参数是模式。文件的模式一般有四种,读取(r),写入(w),追加(a)和读写(r+)。如果希望按照二进制数据读取,则将文件模式和b一起使用(wb, r+b…)。
' ^4 F0 ?9 T3 i7 u3 L0 b0 p% I; J0 v7 s8 X+ q( ?, o
再考虑一个场景,要读取文件内容,并把年龄和名字的顺序交换存成新文件age_name.txt,这时可以同时打开两个文件:
( T% Q7 T+ G, l  Y' |2 @( Hwith open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite:2 p# K' G' m/ ]
line = fread.readline()
/ i& p- s: s) W& p7 `; ewhile line:. j" C, r0 g: ^5 k* m# i, M
name, age = line.rstrip().split(','); c' i8 t. D, X
fwrite.write('{},{}\n'.format(age, name))
& c1 U( L0 P3 A, s, p/ h8 _line = fread.readline()
/ a6 K" W, {' \: B( o! I" \9 _! @+ X+ c0 d6 o3 b
有的时候我们进行文件操作是希望把对象进行序列化,那么可以考虑用pickle模块:( \+ N7 x5 L% E
import pickle
4 n" W. ]* b$ G9 |: j/ V; o* z
9 M- t2 C, I  P6 o0 plines = [
3 |9 _2 _2 T" C3 B+ P7 h  U+ i"I'm like a dog chasing cars.",' }+ t- ]7 U& P. x* _8 ]- R+ a
"I wouldn't know what to do if I caught one...",, r2 P4 p- Q2 k+ V
"I'd just do things."7 C; Z1 k! o' P, r( U: z
]
1 b+ x" d4 e  `* V7 D' Q* L" k
! @7 V0 L3 P  N! Jwith open('lines.pkl', 'wb') as f: # 序列化并保存成文件
% A, }* H$ f/ x! M; w% b( t- tpickle.dump(lines, f)
5 K5 B0 X( ]2 ^1 w+ R
4 P3 O# p  P+ I7 m" c+ R: I$ [8 {with open('lines.pkl', 'rb') as f: # 从文件读取并反序列化4 i8 @/ A8 D; A9 l: @4 R
lines_back = pickle.load(f)
( C# x: _2 ?9 e2 l9 S2 ]( G
, q$ m0 k' ]( j1 T0 ?print(lines_back) # 和lines一样6 h) ?" T: P8 d- \: W

, I4 k4 ^0 I" ^9 A; b1 }注意到,序列化的时候就得使用b模式了。Python2中有个效率更高的pickle叫cPickle,用法和pickle一样,在Python3中就只有一个pickle。

3 ^9 v5 g( |* z1 b+ m+ B9 P& [) ?2 \( a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 10:28 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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