数学建模社区-数学中国

标题: Python OS模块学习(一)剪切 [打印本页]

作者: Seawind2012    时间: 2012-7-10 13:49
标题: Python OS模块学习(一)剪切

' _1 S3 |& x4 w. V
5 n6 y" g5 T7 z0 _! wos 模块提供了一个统一的操作系统接口函数, 这些接口函数通常是平台指定的,os 模块能在不同操作系统平台如 nt 或 posix中的特定函数间自动切换,从而能实现跨平台操作4 {4 N: k2 l% k% }2 H4 n& ]9 K

* f" O- m1 ?5 e3 v, A   ! |: J! `: ^. `4 W- v8 V

" E7 K3 h, f" l1.文件操作* d# Q7 X6 X& p+ G* K

! Q* r' p; ^0 o1 ~) h9 R: V8 W; E* nbuild-in函数 open 实现文件创建, 打开, 修改文件的操作) l5 }$ a5 P3 i' v
  R5 O' e3 ^4 T. I+ T6 c

# k0 G9 W7 ]) j0 @. u  w8 m0 M: d
  D) m9 z: s3 w! \" r9 d) Simport os/ x1 z0 E, d) ~& P
) M9 v/ e* z& ?2 S
import string7 c: }% X0 N3 ]* B, b4 I
/ K3 J% R" k7 f# w1 D
   
- U" [  m7 q% _# D
* ]$ k( G! u0 a* p7 }def replace(file, search_for, replace_with):
7 g" z+ k3 {4 C; a/ u0 A; M! u, a1 [  Q, o) N7 f
# replace strings in a text file
# D+ G  u. d& w0 x& X& S% H9 n: j7 x
   
* B, P/ v9 m/ k! d: \" \4 T
( n! N" m" ?, m5 _! d9 vback = os.path.splitext(file)[0] + ".bak"$ U$ K" ]. Q5 O" n% |9 z9 }2 N
% W! @: R0 {1 `) K& u
temp = os.path.splitext(file)[0] + ".tmp"
7 {, y/ ~% Q$ [6 G$ R& w7 {  M6 m  |9 w/ M1 x
   4 H; Y3 x7 F* d. R$ D
) G+ G0 @9 u8 G* o: S
try:
2 |: V( m) C6 l- K0 q, z$ D! s$ Q# ^$ v6 A
# remove old temp file, if any
9 ^5 E2 F- N' b4 u2 s! U& _1 N0 M4 e# E5 G4 A) C
os.remove(temp)
& [5 q  Q2 Z. g- b$ F0 J; ~. I- X& {% e+ _$ W; z3 A6 A  ?
except os.error:
3 Y: p0 ]9 \7 }- I2 y
  W: b; L' j, lpass
8 D% u! b. I( \  N, ?0 K5 C8 q/ ^
, U' f4 X# M. W2 R$ |5 t3 m   & L% T1 {7 x! Z- t* u1 @

$ H6 y7 j5 M8 j/ }  P/ ]" Nfi = open(file) #
" y) v8 B  `6 |8 A! m! M: d0 O" f. o) \7 H! c
fo = open(temp, "w")        #
- t0 g/ u0 p9 d, T* Y3 o8 ^8 o* e+ a/ e2 V# i
   
2 g: H8 R! T" g4 P4 I. h9 M$ i3 r- @# U# }2 w  ?& U+ U+ u, R
for s in fi.readlines():- m, ~. [% k5 m6 L& v

2 w/ y: b' A- @+ E: Kfo.write(string.replace(s, search_for, replace_with))
& v& A( v0 ]/ L0 \. S& B" o) E
, ^. [! e, ?, a( `. E   . C& ]$ f$ M; N6 V, e$ k
( J4 f$ j1 Q( q7 P4 {
fi.close()1 M7 Q+ v( k1 c
  |5 x' b. E+ M  i$ Y
fo.close()2 l4 W; k  H4 `( S9 P; P* y
) U/ S/ V; K9 _8 _% I8 z+ Q
   7 ~" ]) B- S/ S/ H) S$ @

4 B" K* ~) a( _1 Jtry:
$ C) O2 q& d& C: |9 q( [6 D- y% L+ V) x# u4 K0 t
# remove old backup file, if any
6 w1 c2 S. n$ a9 p, i. q9 w* v2 }- g. ^$ @: z
os.remove(back)
: [# `+ o1 a/ p' _
3 x5 p( n, n6 B# Z6 ~except os.error:
3 i. h6 v) B+ C! P9 Z+ U! h; L5 v9 u% U3 Q
pass
+ d9 |5 I; K' @8 Z1 l) a* w2 @
/ Y1 R! a: S& Y& K/ y   & d& ^) p% I( t. y

7 X6 a8 N% u9 H4 ]* F9 V8 h! t# rename original to backup...- d8 ]' f% `+ p2 R

2 s0 b6 ^" t( M. S& ?  Zos.rename(file, back)% M- Y. t) |) ]. l3 n- h, D

1 W& A/ S8 R- P$ E7 a   
/ |. j$ j1 E  i; z( h& j/ N* j; e9 Y: B2 g* }3 Q) \! @
# ...and temporary to original" G  c, R) \# Q2 ~0 p5 Y% |, W% o
; Y; }! A; r) r3 `+ X/ q9 y
os.rename(temp, file)
' F3 C+ }5 y; P# f. T4 b- w# B
1 y5 i/ b, e8 H# A+ g* }   
; J8 T6 P# O, s! j5 E$ p3 F, T2 h1 T6 I4 T
/ I! Y2 H6 a/ R& M  l# try it out!
; y2 X* I+ Q; ]* D7 _- I, C
( Z5 O5 u* ^# R8 j# l) g3 k( |   + a7 l6 \' M  D6 D# m  b. C
7 z# v4 x. s/ `: x: C; E2 @: b, o
file = "c:\samples\sample.txt"
2 D6 ^' w0 g: r' x( V& N
6 N0 v6 W9 T  U" o0 H   $ y% G3 `8 D; H2 M# n% d
; h+ c5 J0 k/ s# e  C% c8 z. Q
replace(file, "hello", "tjena")# search for the string 'hello' and replace with 'tjena
& p. g- |9 B. ^* o2 `
2 H: B, t3 m6 C  l8 h0 }replace(file, "tjena", "hello")
0 A4 P- {* `- s  ~
" J9 X- K) W; n0 H* ~( B* ]$ T   
6 v2 `  z- y5 g& |5 [5 d
! D7 [; |$ a) F2 I: Y) n& t' U2. 目录操作
$ h- g/ w; v: k0 y, G  ~7 w: U" B4 {2 r" f
os 模块包含了许多对目录操作的函数6 e- y" T4 v8 D

9 A: B2 \4 F9 Z% O3 m3 _listdir 函数返回给定目录下的所有文件(包括目录)
! A3 y0 s7 O9 o
) j- p: l  `3 Z6 j   
3 M9 _  \4 D9 ^, h9 |
* C, V& n7 A" dimport os
- i7 u5 Q- y# D; k+ U+ d0 K* K% q+ q$ {9 n6 F
for file in os.listdir("c:\qtest"):. h  H& \+ A/ u* V9 {; d3 E6 O" Q# n6 b
! y" b! P; |9 P9 b6 K  j, @; p4 Q
print file1 a2 Z4 ^+ v' O$ O) h* `
1 n$ Z7 T5 i" {0 ~' ]0 s- e
   
" L' V& @- l) K- ^: K6 J2 e: I2 |1 M
2 V/ ~2 M5 [8 x' ~- Y. ~. Q+ Wgetdir 获取当前目录+ J( F. b& c; U0 I; _) V

) }4 ~' a; M, o; k$ Dchdir 改变当前路径/ g( E5 r/ M+ D
! A$ U! q5 ?6 Y1 e
   & x) U# n5 N+ `5 d

0 r% _9 I) J3 [' zcwd = os.getcwd()
( t0 b9 [" ]* _; H4 f4 A. l) V1 `# e- h9 O' s! z
print "1", cwd
# y8 b, z# @/ s$ F
) Q0 K+ a% h6 O3 m; E# go down
' `: ]8 t( S* ~8 u) o# j3 X9 n" k* G( i3 T3 K1 g- e
os.chdir("c:\qtest")0 o3 |3 w- r4 F& Y5 ~  M8 d4 g

1 x0 ]" D1 X, s, i! z: n' V$ t. Vprint "2", os.getcwd()0 o6 H9 ^. W  \& _' U  C

# v/ o' j7 q2 d' ^+ O$ o$ f8 W) V# go back up
# T; b8 I/ t' X0 R$ ~) \: y* D8 z1 B& q
( E7 x' G" y; \0 P5 Y0 ~os.chdir(os.pardir)#返回当前目录的父目录& z! g5 q6 o2 o
! T( r2 q% F% I
print "3", os.getcwd()2 v" N& C2 K8 G( M9 Q

" S: W5 n" Y) f3 d& W8 @# [1 O( g   
. k* u" G, ]* v8 x5 x/ p
! y2 y5 U% w- Qmakedirs removedirs 生成和删除目录
) ~; F$ W/ I- \0 X
6 E- C; O; r& I% j, ]8 Z: K5 emakedirs可以生成多层递归目录, removedirs可以删除多层递归的空目录,若目录中有文件则无法删除
9 |0 I9 d0 G" M$ P; N* g( C! n8 |) \6 f4 `
   
' \7 ?/ R5 ]8 t4 \. Z  r. ?- g1 L9 Y
import os
, H8 C. i8 T6 R7 c2 M$ K/ ?1 @1 c7 o( a2 X  w7 x6 _
os.makedirs("c:\\test\\multiple\\levels")) y" ^) `, j& c: W
$ X9 G: L; T5 g  _
fp = open("c:\\test\\multiple\\levels\\file.txt", "w")0 B! P) |# S6 |' s! S5 G% ?
" I& l, ?: G: P2 O# Z* J
fp.write("inspector praline")
; ~1 m/ b  y4 S7 Q$ x
; ]  P: D7 m) y$ B+ Xfp.close()  W- t5 k. ]8 h9 _7 k2 ]3 l8 N
) j- p) y1 u3 y$ V  B+ }9 }
# remove the file
3 A) S' N6 Y7 \; V
# ^# j; ]- Y. S$ R" k; L* Q7 Kos.remove("c:\\test\\multiple\\levels\\file.txt")
: z' K+ D$ D! u# N$ K- {/ @  |7 h3 U) {' h! C
# and all empty directories above it
0 S* w9 b5 f& b. C$ l; ^) F
3 T. v/ D* ], Q( X* i. Tos.removedirs("c:\\test\\multiple\\levels")) X$ ]: ?0 D% R, ^: q4 F4 _

7 N6 p- ]( w7 ^" Q$ ]2 _   # s0 _! w3 o6 {" S8 ]# v6 f5 R2 _

7 {& c) p0 m: U5 y! G6 L+ s' Q$ u1 A0 V7 zmkdir 和 rmdir只能处理单级目录操作.
# {8 r, Q& _; _, v+ g% I5 r% A' N$ i
2 u4 h( Z2 s' B+ g4 N5 C若要删除非空目录, 可使用 shutil模块中的rmtree函数  e$ t. c5 Q! e6 @
- M/ `/ w7 B7 S( W8 O# z% Z
   
/ B! M- R) X; m) f' U& O7 D: t' Y9 _1 Q+ j% \
3. 文件属性的操作
( c8 v, i& d( p; I; u! n
- S3 T) Z% t7 D& A7 zimport os: v6 M; R8 A% Y' J& W: W. X: X
9 B4 G% k' R3 A7 [/ `8 |4 N
import time
; n; f% A' O$ r9 n5 _& j0 f# B* P9 b3 M- D9 v  I3 V+ n! d. e
file = 'c:\qtest\editor.pyc', k- A( T: H2 M  S) Q% ?9 V: p! b

# [1 o9 Z+ f5 K+ {4 u3 D8 X7 f  H   ; u. C7 ~$ F0 w5 e

* T+ I7 H5 P% _& t& T' yst = os.stat(file)* A3 F' Y0 z! u
* z1 z/ u( x! u& G
print "state", file
" |2 K7 `( Q, t6 \3 Y3 U% Z5 }. j/ r4 l5 [+ U5 w( ?) c
   
0 j% [. g* p( R' y$ G1 n: w; t  q$ [1 D: a- y. _2 T# V" [
def dump(st):/ ]6 l6 G" [- e# ]
6 S+ t' [: [, b& Y& A$ H
mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
3 x' s. q; y( e) @/ o5 w$ w  s! L! G
print "- size:", size, "bytes"
8 u$ k4 I1 X. P% R& h" \
& M& \1 ~0 w& E. {print "- owner:", uid, gid* k. _0 @5 ^- q0 t( f1 X* [
2 n& I% n7 C8 s. R
print "- created:", time.ctime(ctime)
; n8 R6 N9 X$ l2 R! T: _4 V7 m0 X  t6 b+ a
print "- last accessed:", time.ctime(atime); w. i4 B9 x- U# U

6 y2 G- S+ r8 ]- @8 e7 w2 b' pprint "- last modified:", time.ctime(mtime)) {6 Y4 I, g  q: B& S5 Y4 D1 m# w7 \
0 V; H3 D( h% p3 }# t: R. v) e
print "- mode:", oct(mode)8 p/ g7 u; f" \( K, g9 n
# x/ X: ]; F' M6 ?
print "- inode/dev:", ino, dev
8 k5 W  }- z  L4 q( n& z
0 [: y& G" J7 ~/ n   
4 S% ~. Q, }  m% x& Z
  }( f# F' u9 n7 \9 ]& jprint dir(st)" C8 V7 W: Z2 W/ n7 I, l: h
" z( R: ~, N# C# Y1 `" u9 ^2 U7 R/ A
print        
; ?+ q: e; k5 H6 v2 `3 x
; h9 u& F% `' b4 e# x, ~6 Kdump(st), G! f5 G# @# C  J
$ l- I- M1 h5 Q
# print- F" H- x' s, I: H

$ X: s+ d, v; }, C! A   / G0 A4 x* A$ i  c5 z. g/ _

" g. _1 T1 D' P. ^3 |fp = open(file)
- u3 [7 _: \( G- b! g/ O0 B0 I: O, k/ L  H' S/ V4 r& D+ N9 d
st = os.fstat(fp.fileno())# Y- S/ M" e, J7 [  x

' ~% T/ b. J+ \5 \6 m7 L; d) ?print "fstat", file
1 G4 O4 _2 G- }6 a$ ^$ s" k
. g+ V  W, ]4 Ldump(st)" }% O8 w# t7 U; Z- c

, V3 K3 t/ A& [- C8 n   : D. n2 |& S% h" J/ r2 R2 {& h

# n- U9 V" [" @( Eremark: os.stat(path/file)返回文件的对应属性值st_mode (protection bits), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (user id of owner), st_gid (group id of owner), st_size (size of file, in bytes), st_atime (time of most recent access), st_mtime (time of most recent content modification), st_ctime (platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows):
; A$ h; G3 j( q" ^0 i4 X* P$ \
( Q! I# L3 d( a" los.fstat(path/file): g$ ^6 ?( Z. r: c: A
( T0 Q% p% F* a. A7 ~; {  K$ ?
Return status for file descriptor fd, like stat().
作者: darker50    时间: 2012-7-10 16:38
  可以放进文档当成附件下载的!
作者: Seawind2012    时间: 2012-7-10 19:00
darker50 发表于 2012-7-10 16:38
: H* @8 o, z# M2 s  w可以放进文档当成附件下载的!

% i" A! q- z0 d3 {- `9 I. p很好的建议哈




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5