新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V5.9版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 490|回复: 1

[模块] 7560 - Python库 AP087【os】内置模块文件操作功能

 关闭 [复制链接]
发表于 2021-8-21 15:48:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

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

x
Python3  OS 文件/目录方法
6 B' T% g3 n! T/ x) b! G& Sos 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
* r7 q7 J# t8 o: u/ s+ ~/ k
序号
方法及描述
1
os.access(path, mode)

// 检验权限模式
2
os.chdir(path)

// 改变当前工作目录
3
os.chflags(path, flags)

// 设置路径的标记为数字标记。
4
os.chmod(path, mode)

// 更改权限
5
os.chown(path, uid, gid)

// 更改文件所有者
6
os.chroot(path)

// 改变当前进程的根目录
7
os.close(fd)

// 关闭文件描述符 fd
8
os.closerange(fd_low, fd_high)

// 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略
9
os.dup(fd)

// 复制文件描述符 fd
10
os.dup2(fd, fd2)

// 将一个文件描述符 fd 复制到另一个 fd2
11
os.fchdir(fd)

// 通过文件描述符改变当前工作目录
12
os.fchmod(fd, mode)

// 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。
13
os.fchown(fd, uid, gid)

// 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。
14
os.fdatasync(fd)

// 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。
15
os.fdopen(fd[, mode[, bufsize]])

// 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象
16
s.fpathconf(fd, name)

// 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
17
os.fstat(fd)

// 返回文件描述符fd的状态,像stat()。
18
os.fstatvfs(fd)

// 返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。
19
os.fsync(fd)

// 强制将文件描述符为fd的文件写入硬盘。
20
os.ftruncate(fd, length)

// 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。
21
os.getcwd()

// 返回当前工作目录
22
os.getcwdb()

// 返回一个当前工作目录的Unicode对象
23
os.isatty(fd)

// 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。
24
os.lchflags(path, flags)

// 设置路径的标记为数字标记,类似 chflags(),但是没有软链接
25
os.lchmod(path, mode)

// 修改连接文件权限
26
os.lchown(path, uid, gid)

// 更改文件所有者,类似 chown,但是不追踪链接。
27
os.link(src, dst)

// 创建硬链接,名为参数 dst,指向参数 src
28
os.listdir(path)

// 返回path指定的文件夹包含的文件或文件夹的名字的列表。
29
os.lseek(fd, pos, how)

// 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效
30
os.lstat(path)

// 像stat(),但是没有软链接
31
os.major(device)

// 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。
32
os.makedev(major, minor)

// 以major和minor设备号组成一个原始设备号
33
os.makedirs(path[, mode])

// 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。
34
os.minor(device)

// 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。
35
os.mkdir(path[, mode])

// 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
36
os.mkfifo(path[, mode])

// 创建命名管道,mode 为数字,默认为 0666 (八进制)
37
os.mknod(filename[, mode=0600, device])

// 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。
38
os.open(file, flags[, mode])

// 打开一个文件,并且设置需要的打开选项,mode参数是可选的
39
os.openpty()

// 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。
40
os.pathconf(path, name)

// 返回相关文件的系统配置信息。
41
os.pipe()

// 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写
42
os.popen(command[, mode[, bufsize]])

// 从一个 command 打开一个管道
43
os.read(fd, n)

// 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
44
os.readlink(path)

// 返回软链接所指向的文件
45
os.remove(path)

// 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
46
os.removedirs(path)

// 递归删除目录。
47
os.rename(src, dst)

// 重命名文件或目录,从 src 到 dst
48
os.renames(old, new)

// 递归地对目录进行更名,也可以对文件进行更名。
49
os.rmdir(path)

// 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
50
os.stat(path)

// 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。
51
os.stat_float_times([newvalue])

// 决定stat_result是否以float对象显示时间戳
52
os.statvfs(path)

// 获取指定路径的文件系统统计信息
53
os.symlink(src, dst)

// 创建一个软链接
54
os.tcgetpgrp(fd)

// 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组
55
os.tcsetpgrp(fd, pg)

// 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。
56
os.ttyname(fd)

// 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。
57
os.unlink(path)

// 删除文件路径
58
os.utime(path, times)

// 返回指定的path文件的访问和修改的时间。
59
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

// 输出在文件夹中的文件名通过在树中游走,向上或者向下。
60
os.write(fd, str)

// 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度
61
os.path 模块

// 获取文件的属性信息。
62
os.pardir()

// 获取当前目录的父目录,以字符串形式显示目录名。
$ @8 E8 I8 U' H
/ F4 m% G5 B. z! l7 a
1
os.tempnam([dir[, prefix]])
Python3 中已删除。返回唯一的路径名用于创建临时文件。
2
os.tmpfile()
Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。
3
os.tmpnam()
Python3 中已删除。为创建一个临时文件返回一个唯一的路径
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
 楼主| 发表于 2021-11-6 16:48:25 | 显示全部楼层
ps:下面看下python读写、创建文件、文件夹等等7 I, }2 o% ]. F
& P. X) q& a  u+ U6 a
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。# t( P2 r+ @8 b

2 \* o, Y4 k9 c得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
* l& F; O+ r0 a9 {6 x
% V/ j. B+ \6 T) [/ |( C1 g4 x
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

7 U7 T- q0 B0 E3 J* ~; e
- v: m7 q2 M# Y6 R$ Z0 S函数用来删除一个文件:
  1. os.remove()
复制代码
, @% K0 i- L& ~1 I" z( y

" Q3 F' t, ?, R7 ^; a; x8 Y9 a删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

/ U. F& o, [+ u8 \% z! `$ |* [
8 X0 f& k& G/ g, ?- {: D+ I检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码

8 u; E  e. G* j& ?; K! C8 f, x3 Q5 ~# ]% V7 f4 h% |5 g
检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码

* ?  h- J0 s. H) T8 L9 O* m( l5 P8 w9 j* W( k8 B" h
判断是否是绝对路径:
  1. os.path.isabs()
复制代码
  O0 M% \# D- o; y& K$ E
1 R/ D* ]8 N7 y( }
检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
' ]( i+ e' o( d

" }# y+ q9 ]$ B( g. k7 D, \% s返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码

; Z$ @3 X, n4 ]5 t$ y  [( Keg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码

4 V# R2 I1 R; b6 h  }9 [: j4 Q& w4 W; S) K  @; g
分离扩展名:
  1. os.path.splitext()
复制代码
% x) G/ ]/ O, @" `  F2 |  r- k; p% O( d
6 T3 r6 e8 J- q
获取路径名:
  1. os.path.dirname()
复制代码

2 N. ]( ?3 D' \2 O* }% e1 G' d7 Q' r3 v! e
获取文件名:
  1. os.path.basename()
复制代码

2 B9 g7 J8 T0 a7 Q0 m! ]; W0 A' q; ]1 W
运行shell命令:
  1. os.system()
复制代码
) B5 q3 d5 I9 y

6 S$ z* S; k0 W( @" M# K读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码
. u) s, f# ]% I. i
) H8 R# Q$ d' f0 K9 o
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
( D2 g; K" R7 J* E6 M8 T+ e% N' e( N0 I6 {& i! j
指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
. h6 B2 |& A9 {$ V0 ~! B
4 {, w2 [5 W/ ~( k* G! k重命名:
  1. os.rename(old, new)
复制代码

8 j7 S- g5 O% b5 Z+ n6 f. Z9 }+ t  W* w2 f! e) o8 G1 P  O6 ~. T# q
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

6 a/ V5 y8 f" G0 Q- ^4 b( Y% P, A
8 _( c; H9 T: T6 ^, q/ m* m2 Q6 W创建单个目录:
  1. os.mkdir(“test”)
复制代码
2 |3 E- ~6 d, P* C
8 V  w4 _% ~  `) H
获取文件属性:
  1. os.stat(file)
复制代码
, I6 c: e, T8 A0 W7 U' F/ T

* I8 A3 ?' T$ w- P: b/ J" X9 r修改文件权限与时间戳:
  1. os.chmod(file)
复制代码
6 ^2 `; r" n7 U3 c
7 b! o4 N; E: G1 ]0 A
终止当前进程:
  1. os.exit()
复制代码

  y# S! G% {) S4 w5 @2 A) M. U1 C. @
$ O" O( c% ~! k- k' W8 @获取文件大小:
  1. os.path.getsize(filename)
复制代码
" l$ O" a, N: X5 o' i. Z
& N! g2 c! D' t0 v+ ~
文件操作:- R7 ?# t' H1 M) d

9 z* c5 y! U) _- F1 u4 s1 V+ \, ~; O创建空文件
  1. os.mknod("test.txt")
复制代码

6 c9 J8 |$ g" U  O! H( I直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码
: m( S. S- R/ J* t1 X8 H' P+ d
4 j  a, L: v5 y+ [# j# P
关于open 模式:
, i0 P) q0 \1 D0 e& c2 x6 [w     以写方式打开,
$ R/ _! a" a1 A, E* ?0 X% E- @# Ja     以追加模式打开 (从 EOF 开始, 必要时创建新文件)& a, [. L, k8 K  `0 J" T; h
r+     以读写模式打开
1 z7 k: I" K- S. d0 Ew+     以读写模式打开 (参见 w ). d% K( U$ S* m1 ]
a+     以读写模式打开 (参见 a ); h5 _2 J7 r7 x+ ~; r
rb     以二进制读模式打开% s( a) {- L: ]/ B( x, D; }: i
wb     以二进制写模式打开 (参见 w )* ?, z& r* V% N( L$ W
ab     以二进制追加模式打开 (参见 a )3 ?1 i" x8 x9 a( m% {& g
rb+    以二进制读写模式打开 (参见 r+ )0 x, K+ M" A/ x# M
wb+    以二进制读写模式打开 (参见 w+ )- z% }3 p  H0 x2 A+ t; Q* v
ab+    以二进制读写模式打开 (参见 a+ )
9 K4 G8 b' |) V- T4 e2 y# s! Z5 I1 p, |$ b! ^/ D; {% r( N
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位$ g4 u0 R$ i/ A. u- h( v
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
1 H  e6 X) S+ L/ q
: B' @+ L, w2 S9 H3 f2 D
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
8 k1 N; V9 A" q3 t$ E2 f  {7 {/ V: ?8 j' j+ E; g4 l  y
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符5 Y1 S% t8 ]0 U8 K

# e$ D4 {. z$ _
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
6 w9 r4 p7 G3 @) |( O/ L* f) N' Y( n8 m: f
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError6 Z; A1 K6 J: o1 o9 M

) h! N6 ^4 x2 {9 V
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
: s7 W* P. J2 D* @( c 7 L/ P, t2 d) N  j6 e) c' ]6 a
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
+ l) f9 p) v3 M9 G  b; R+ Z* J" ?- s( S" }( f4 t% ?
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
4 \& z) `& V7 {) ?8 e, [2 K$ `) z$ \  z" z# A, X) a4 |
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
' c. Y4 m  v5 Q* b( W1 Y* c3 m: _: C& h5 p5 }! n/ q; Q) x' x+ x
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
# ^& P- G- U) ~. ?
" t( D; }* b# q
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。1 }  _' @  ?- K. _' P1 x
) ]& s1 O) ^/ d- Y
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
: O" C8 g  d6 e& N4 u/ Q" k/ K
) y0 r3 J+ ?6 H目录操作:
% o+ \6 P( ~0 U. U- R( r7 r; h$ V$ U' q) p9 |
  1. os.mkdir("file")
复制代码
                  创建目录
+ b+ F* `) \; N% b复制文件:) w( C6 e; z/ {3 `6 A: n7 G
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件6 Y! t; ^1 t3 s/ a* p9 \
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录" R& e% w* e5 e" W% |: [/ m' {
复制文件夹:1 k* b1 Y) n; }2 _* K
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
. K# c+ n8 i& U8 I重命名文件(目录)
- W3 s6 R! u, B# r: |
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令
5 ?+ R: U7 ?, Q' ?& z移动文件(目录)5 p) \/ D& Z' Y  u  y, N5 \
  1. shutil.move("oldpos","newpos")
复制代码
+ P2 g+ n3 d' A! h
删除文件! o4 J5 @1 \: |- T6 v* D
  1. os.remove("file")
复制代码

2 g( J) U* `* j/ S. n; ~6 f& l删除目录( a! U* d1 n4 _5 u4 T) {
  1. os.rmdir("dir")
复制代码
   只能删除空目录9 ?$ }' T0 S4 N5 C  P6 A0 u4 L# f
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
4 c2 {* `$ }1 D! V" L2 O转换目录, C- M5 r9 @; h9 S
  1. os.chdir("path")
复制代码
  换路径3 p% ~& i& J1 l4 o; Q

* j- v: o1 \" i5 U4 S! ]: {" y% M: ]1 B7 v7 `( S2 k0 P9 [
Python读写文件
9 x: A* s% n8 Q( j; ]! B+ ~/ G- r3 {- G2 M5 J! Q# y3 h/ v& A8 S, o
1.open. b' C- D% Q8 P; h# u: ]# {( g
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
3 g& r: ?; ]- D5 u) p4 Q
8 A5 H9 w1 d: O- B
  1. file_object = open('thefile.txt')1 p, ^- I- b8 O; Q9 N$ b
  2. try:" G4 u0 h7 p" L4 m# h
  3.    all_the_text = file_object.read( )
    ! r$ l. [' ~7 M/ f. J7 m
  4. finally:$ J+ C1 J( I  s8 F" Q0 N7 C# x1 }
  5.    file_object.close( )
复制代码

9 _" T" z! c3 D, z7 }注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。/ p. e: C" U8 T# L

# \7 m! T' `9 `' q2 l4 M/ i2.读文件
& O5 S6 A6 w( E) x. q0 K
0 x4 ~8 p# J& }9 R, B9 A读文本文件" y8 m/ z% v8 C. O/ V
  1. input = open('data', 'r')5 t" I3 j8 G# I7 B- {
  2. #第二个参数默认为r8 H# k/ d0 [# I" O2 W
  3. input = open('data')4 J" H( P1 [6 X5 @' I. U/ y4 w
  4. 读二进制文件+ D1 W) W4 t( Y5 @/ L1 A
  5. input = open('data', 'rb')
复制代码

. q7 N1 t, z& m
: v0 O8 P' j" D读取所有内容
* `' U6 [  T! ]1 v. c% v( ?, G
  1. file_object = open('thefile.txt')2 g+ ]/ A. i& H0 r  O% z2 G4 Z
  2. try:% P" ]! d  B2 l
  3.    all_the_text = file_object.read( )( J" [6 C, _3 u' B" ~& z7 F5 _
  4. finally:& h, O+ I' T7 y. q5 b& _& Q
  5.    file_object.close( )
复制代码

# E7 V8 [$ ?( l& a$ o' P& j! c; u$ `, g) q
读固定字节: z' y+ r- ]7 @3 F
  1. file_object = open('abinfile', 'rb')/ S3 K, _7 M" O7 e& D7 G& J4 e
  2. try:" j8 |1 i! B4 z$ p; M* c
  3.   while True:2 S4 z( G/ B+ \# |
  4.      chunk = file_object.read(100)
    0 f. N& F) I% a7 [
  5.     if not chunk:( b* e' O5 \9 v$ I, [# C
  6.       break% V0 E+ C% }. }7 S
  7.      do_something_with(chunk)
    5 \2 @7 N2 `* i4 ^2 w0 U
  8. finally:
    2 Y! f$ g! Y8 @+ x# W% Y. e* A, y
  9.    file_object.close( )
复制代码

$ ]) x7 R. Q- F) h$ Y, n
. s- S5 J/ J9 v2 `7 |: P; t读每行
/ g8 R& L% y/ L9 k0 E6 ~5 v
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
- m! W" t" ?# P& s  A. [' I/ y
+ k8 t, H: l& T: i3 _
如果文件是文本文件,还可以直接遍历文件对象获取每行:9 H, l1 j8 v* }3 W! |- }
  1. for line in file_object:' R- W$ h3 R3 D5 M
  2.    process line
复制代码
( n( f7 c; O/ D" u5 t4 ]' Y( L/ e

7 q$ i2 t3 w4 I* c5 v# Q3.写文件4 g% n2 o* q, L, d1 y0 g9 z; n8 p
* ?4 b+ A/ S) ]! s. K* t! G
写文本文件
; }! P9 @* r1 f( y5 R; U/ K
  1. output = open('data', 'w')
复制代码
! X9 j1 p* L* Z9 P4 l9 C' b8 L

$ T; |0 I1 {7 M4 ]3 n4 _写二进制文件
: N2 e% j4 c- r6 }! O
  1. output = open('data', 'wb')
复制代码

9 G( ?; S. x0 `0 o" r  v0 d/ q- R) a# c4 P- o1 ^& ^/ j% T6 f
追加写文件4 O6 K; I# J7 B( I3 s6 P) p) w/ F
  1. output = open('data', 'w+')
复制代码

1 v2 u. k2 D/ X7 w% c9 U. a; n; c
$ m- |  a# J! U( @% J# Q写数据, O/ h3 j" k7 F0 O0 C% @4 V
  1. file_object = open('thefile.txt', 'w')
    1 o* \) z3 c5 S; R9 E  N  ?  B( K
  2. file_object.write(all_the_text)
    * y5 o2 N! E3 X- R  q7 `3 b
  3. file_object.close( )
复制代码
; X4 n, f: t+ q

2 G' v* \0 p: _- ~$ R% F写入多行) @' C8 w  t( c) \& s' M
  1. file_object.writelines(list_of_text_strings)
复制代码

+ J+ q7 _- s# v+ n7 v3 V- g. M, R1 I6 C: _
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。. u& Q/ i2 s' G! ~# P
6 \% W" O( Q0 o
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
' w0 Z4 a  A& U4 @在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:0 m: |$ [" r1 }6 f6 w7 h; g  y
  1. file = open('test.log', 'r')sizehint = 209715200  # 200Mposition = 0lines = file.readlines(sizehint)while not file.tell() - position < 0:    position = file.tell()    lines = file.readlines(sizehint)
复制代码
2 {. n# {. n! {, h5 F  b9 R, {
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
1 N; |4 Y6 s( L% H) X9 q" o
7 ~( x: F+ I2 F3 b& rfile在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
- K3 ^8 W2 k9 G. M( z
" I& y; X+ h3 Z% c  [( `! w
  1. file(name[, mode[, buffering]])
复制代码

3 O% k0 `$ _; j7 e& ffile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。- _, m* H$ k, h: }- A
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
: Z6 Q3 Q/ n- o4 F, c: `) xbuffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
. [6 h' Y7 j* S' J6 E: t& \! j& t1 N+ p: |, U3 f/ J2 G' D
file对象有自己的属性和方法。先来看看file的属性。6 r% R1 w0 i$ Q) @9 m5 j8 v$ L( M4 T+ F

3 s+ p, z$ {- r! aclosed #标记文件是否已经关闭,由close()改写
- O1 Y, i+ M" R' {. E9 ^( J0 pencoding #文件编码
# |! w0 t; Z+ umode #打开模式, T' a  ~! a' E5 Y6 A
name #文件名/ R7 j+ s% [* Z$ @8 k  q
newlines #文件中用到的换行模式,是一个tuple
4 U4 G7 Y7 j. |softspace #boolean型,一般为0,据说用于print
* \: ~) ]8 r# }( t
: y1 @' _$ L1 I6 X4 [file的读写方法:
$ Y- g2 m  r+ ~# z
# n& j- V  M% Q/ NF.read([size]) #size为读取的长度,以byte为单位
" b! V# R  c, u% H( ~, }  cF.readline([size])
2 _. u# k; \. p7 I#读一行,如果定义了size,有可能返回的只是一行的一部分2 l( y( Q# d2 ]; |3 ~8 |% K
F.readlines([size])
. Z# s  g# A% u+ x# \# F6 O#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
8 @) J: S# L& ~+ T# `/ l: NF.write(str)
% p+ T& T9 h! g' F& L" S3 F#把str写到文件中,write()并不会在str后加上一个换行符
  e: l2 e2 U% b8 p& EF.writelines(seq)" k9 a! J, i( N$ t! i
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。4 }. s4 f# X# k/ |- o  z/ ?& ?
" |# A0 E7 P6 n8 o0 f, B# |
file的其他方法:  X0 E( r( ~8 i1 q4 X% V

! ?# m7 u9 D( s0 ]/ n2 D7 LF.close()' E4 E* ~5 {: A7 U# H+ B
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError3 d3 A& N7 p2 \6 A* _$ V
F.flush()
; ^0 g8 ~# b3 E: a9 u6 X#把缓冲区的内容写入硬盘( F5 q9 H8 H% r  O5 j
F.fileno(), g" v3 l1 R* U( _% H
#返回一个长整型的”文件标签“( x- K8 C* T# e' E3 g$ c
F.isatty()
; w& ]) t; C9 o# {3 ~2 L#文件是否是一个终端设备文件(unix系统中的)
: I, ~: \+ a7 N. ^( ~F.tell()
7 m$ X* l3 n# X) s" Z7 L#返回文件操作标记的当前位置,以文件的开头为原点
8 c  n1 Z% S' u2 {, W+ B7 uF.next()
  l3 H7 D$ S4 R% h#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。. a1 B" N9 C2 v
F.seek(offset[,whence])
# W/ j) l0 b, `5 r: m3 G#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
* W0 {; D( @! r* `$ w: yF.truncate([size])/ ]5 H: ]: N0 t) C- S
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
4 K0 Q4 c2 }5 v
. e  F( p3 x9 e# T总结
3 ~2 \0 T! `6 Z
0 H. D  ?5 s  R: J/ L+ M1 q以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新大榭七周年,感谢由您!

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2025-7-2 15:08 , Processed in 0.089245 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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