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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
文件操作和pickle) P: |) q4 v! q
6 r7 t: n& n- Q0 ^* t
在Python中,推荐用上下文管理器(with-as)来打开文件,IO资源的管理更加安全,而且不用老惦记着给文件执行close()函数。还是举例子来说明,考虑有个文件name_age.txt,里面存储着名字和年龄的关系,格式如下:
! U1 S7 A9 f3 Z( a/ k6 [  ~Tom,86 N/ f. Q% p; g/ q
Jerry,72 \4 ~" N/ ]8 I. G" H9 A; z' G
Tyke,3; f) b( g' K: V
...: s1 l: a6 l3 v# @$ @1 N) _
# \- W- U! n! t2 d2 e
读取文件内容并全部显示:
3 W2 o- u0 n1 |; ywith open('name_age.txt', 'r') as f: # 打开文件,读取模式
" U2 G( C0 h4 ylines = f.readlines() # 一次读取所有行
  G! k, O" w/ G2 W) Jfor line in lines: # 按行格式化并显示信息8 Q# D9 f- ^) s0 @6 F
name, age = line.rstrip().split(',')8 h/ z6 k6 h2 J) k5 k. b
print('{} is {} years old.'.format(name, age))
" l  H6 E7 {+ p% g
& }/ _; d$ g6 @  Z- \' B5 ?" Q3 Iopen()的第一个参数是文件名,第二个参数是模式。文件的模式一般有四种,读取(r),写入(w),追加(a)和读写(r+)。如果希望按照二进制数据读取,则将文件模式和b一起使用(wb, r+b…)。& r) j% o  ^! S) G
: _; N. A, {( t- b" A" f+ W2 Q
再考虑一个场景,要读取文件内容,并把年龄和名字的顺序交换存成新文件age_name.txt,这时可以同时打开两个文件:
6 F; ~0 _8 z4 Y3 B" Zwith open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite:6 i/ [+ L% D6 t
line = fread.readline()
. v4 F) c, L! A2 q% O# u( H/ [7 vwhile line:
# D( c/ p. |, S* ~+ O4 Jname, age = line.rstrip().split(',')8 C0 T! T6 B) q* ?( d+ x% m
fwrite.write('{},{}\n'.format(age, name))
/ J2 v9 T) p8 K/ Wline = fread.readline(). d' W2 T3 _0 U8 t

2 ~: A1 E7 }( S) G有的时候我们进行文件操作是希望把对象进行序列化,那么可以考虑用pickle模块:7 ]! ^# ?: |4 P0 l$ D
import pickle$ o6 _/ v# R1 c

- e+ X# J( J; C) plines = [
2 s" q5 m& P. W9 X' q$ o0 L/ B" H"I'm like a dog chasing cars.",
* n1 G" T% x: g4 k3 A"I wouldn't know what to do if I caught one...",1 D$ W9 E' X, L
"I'd just do things."
, n6 E  K) B7 u0 T]+ q% b- t: _5 P  R$ Y' p! V
  ]& Y( k" w, U3 ]1 U
with open('lines.pkl', 'wb') as f: # 序列化并保存成文件. r" |7 Y- F; j( K
pickle.dump(lines, f)+ E5 z. E' [! p# K* o: F9 J$ [! A- }- [
& M0 A9 `! C& ?# `) ^: P/ m
with open('lines.pkl', 'rb') as f: # 从文件读取并反序列化
, R$ J2 j4 D0 {; ^2 y% olines_back = pickle.load(f), R1 o5 U: |; X

7 M* x0 y% g4 {: h$ a" Y; hprint(lines_back) # 和lines一样, ]" w/ @0 c+ W7 q( f
& E+ f3 n  r- ]/ R  D# r
注意到,序列化的时候就得使用b模式了。Python2中有个效率更高的pickle叫cPickle,用法和pickle一样,在Python3中就只有一个pickle。

6 `( B( Y% j2 [4 M' G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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