新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 600|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法
' E4 }5 L# E9 U1 los 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

- H. G7 l: t' s3 O
序号
方法及描述
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()

// 获取当前目录的父目录,以字符串形式显示目录名。

) I2 ~4 |1 {5 G3 m# G7 z' v2 g# k, G* z( u/ h
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读写、创建文件、文件夹等等
  K: Y4 n" B' A; ?% Y
8 X8 d. B  e( ^- {: S/ s( p) y8 ipython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。9 g" W" {  J2 f+ I% {; O

5 _& U* }8 v$ ~. F8 x得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
/ ]6 |) P. ~4 `, N
+ r0 ]3 `. w, J  q8 Y
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码
( o5 ?3 o# k5 F9 B# \0 w

: }" H  Z) W# Z: V" P$ _4 Q8 s; D函数用来删除一个文件:
  1. os.remove()
复制代码
; b' _. v+ ]4 e6 Z" p" j

0 d& U1 Q; {( h% w9 u3 d; E- o7 \删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

1 n/ p* o* f/ W- j$ ]% S- \* r7 F2 A
检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码

: ~# I, M+ h. f4 J6 K" ?8 Y2 o9 U# i7 r. o# b6 j. A
检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码

3 _3 T: ]; h: b6 ~* l% `/ \& M3 ^4 |, u
判断是否是绝对路径:
  1. os.path.isabs()
复制代码
* P% Y( W9 `* ^$ n3 A: f+ n

& a: n# m6 c& _3 t检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
' H7 Y8 U$ G3 Z

1 g2 G: K- I8 U$ _8 S返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码

4 [' ~1 ?: Z4 t' H" p* reg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码

+ v" b0 G: l( c$ X8 A, E0 `) _' j4 ?1 M( D, R
分离扩展名:
  1. os.path.splitext()
复制代码

- W9 @/ ]! a; U" p$ {& b4 f7 r+ m$ {
获取路径名:
  1. os.path.dirname()
复制代码

8 V3 L% q. y1 _! \2 W( D/ R! D$ ?" o5 g
获取文件名:
  1. os.path.basename()
复制代码
  m( G2 G" @1 q# U6 s
, D- t. ~7 x, X2 h0 e1 [6 [9 C
运行shell命令:
  1. os.system()
复制代码

  a/ B5 C0 F; H2 c& w% z1 s/ h# A; h( R4 a3 _, x- G9 R8 Q% V
读取和设置环境变量:
  1. os.getenv()
复制代码
与
  1. os.putenv()
复制代码

7 R9 M8 k7 B: r" m
, q4 T2 F; |/ R+ t7 v. l) J/ C给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'  e4 z; f) _- I! F

- y; E2 W7 J4 I% D7 z指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. |# k9 L$ u4 _: M

" R' N- `% S2 }, w% m8 M重命名:
  1. os.rename(old, new)
复制代码
2 J# |: ]( ~1 ?' |1 J7 H# D. D
4 v8 G+ P. X' e2 U# p
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码
3 T5 k* N& Z9 z

, {8 n; S8 Y5 v创建单个目录:
  1. os.mkdir(“test”)
复制代码
( K5 c8 k0 v' o. E
" R0 k% W) I4 V" p# B* H0 K# Z
获取文件属性:
  1. os.stat(file)
复制代码

7 g5 S0 |" y' q; U) [3 T  H: m  @) ~
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码
5 @9 j& W% P1 `3 T9 Z% ^
. D( C# c; {; U& }# @! r
终止当前进程:
  1. os.exit()
复制代码

5 ^2 M! _# E3 W, n! g( v
0 f- [1 n- D7 D0 |' t5 O获取文件大小:
  1. os.path.getsize(filename)
复制代码

0 c3 a+ H  \( H1 g7 _9 o/ D+ f2 v" I: n) i8 l! N" }
文件操作:, s& ?9 Q. k5 k) j
: Y' c; c9 n1 P- |% V; P
创建空文件
  1. os.mknod("test.txt")
复制代码
* N% M+ }( }, u; p- w
直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码
' s) Y6 l( S5 A/ @0 b) Y6 B

. a; F' ?; ]3 _关于open 模式:9 s! T. K9 M7 t, X
w     以写方式打开,1 G' Y" e+ w; n  b
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件), {! a$ P7 i+ T! m: b
r+     以读写模式打开
0 J& H0 H% |) f& kw+     以读写模式打开 (参见 w )8 V/ {, t, U2 Y2 ?& ^0 I7 c
a+     以读写模式打开 (参见 a )! y$ d2 O# L' ~# @2 S& p
rb     以二进制读模式打开
2 _7 a0 s& i- u  Awb     以二进制写模式打开 (参见 w )) D! q, m- O$ E7 D: M& Z5 _
ab     以二进制追加模式打开 (参见 a )
" e+ \) x! T* t; ~, W) M8 Wrb+    以二进制读写模式打开 (参见 r+ ); l; F- W9 B- ]4 `/ c
wb+    以二进制读写模式打开 (参见 w+ )+ T, N: @% n9 G. v
ab+    以二进制读写模式打开 (参见 a+ )% _: F. F0 T+ V9 j0 p

  z  _. s! ?; r. i" [6 h9 F' h* ]/ [
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
4 D  d  E# }' B
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
6 p, m7 f. O+ A: D% ]0 M! d# b# u% U' K! f4 H! g
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
3 h$ Z' k  P- R7 r* O2 V8 P! @) ?# Y
" q4 t# ?' N' A3 x; ^. A
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
3 a! S/ B# W$ L4 c7 B9 {. l2 q( i. G4 E! I
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。2 k  D# [: z3 ^' o: g* \

; o9 T+ x, d  O7 O1 z" o
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
9 _* a7 s; o, C8 H: B
  U- P- t# T! g( V
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘2 ~. b; q5 L0 f( z+ `
% A7 p! s* x8 p& c, M
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“, B2 `0 b/ H: ~2 r& }% U
9 g# ?8 N  J, f( r# F
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
1 R# E" k6 F% X
* J" d: D6 v" l$ L
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点+ a$ K% A! g! p8 ~

& z* M% j5 z( ]" O% P
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。; w8 q" Q& h: Q  N6 N# _" j8 _6 k0 j& l
3 G  U, E( J0 v
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
) C) ^7 X0 {# C0 w  P' I+ u0 Z4 G' F6 i3 X8 a$ |/ b
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
4 d" r3 n; T- c5 f( X2 m3 h
0 O# N! l; D* p4 x5 x" {/ v# }% t+ h目录操作:5 d' p  ]+ l! r, x. U1 P, H1 m5 q/ D
, g7 L. _& ]* B! N8 p% }
  1. os.mkdir("file")
复制代码
                  创建目录/ x; J: R5 R" B; n
复制文件:
9 I9 ~" F) `# f' t" @- G; h
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件6 P0 C& e% s. M5 |& L/ ]& _# t6 s
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录8 C) U, }; V$ n" V
复制文件夹:6 V' h8 H9 L  u7 s& K
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
; D9 N9 D' x, k  {( u重命名文件(目录)
6 O  |6 P# o) g/ w8 m
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令
) y9 n! @: z+ A7 I移动文件(目录)0 f( t5 a7 ^$ _+ ^. V
  1. shutil.move("oldpos","newpos")
复制代码
0 N0 R+ g% o8 w, \3 l6 G3 C: R7 [. \& @
删除文件
# O# L+ z! `0 j- v
  1. os.remove("file")
复制代码

5 m9 D" |/ S2 \; D' y9 D* f& s删除目录
) |4 G9 J: h7 k/ ]( l- |" W
  1. os.rmdir("dir")
复制代码
   只能删除空目录4 |+ G" ^9 q0 V; Z& l
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删  D: \) d' X* f2 o' {- t
转换目录
+ u  E0 Y9 @  v3 k% o% h0 D
  1. os.chdir("path")
复制代码
  换路径5 p6 _; D8 a0 U

: u3 }& F& r" x5 R. R. N- x2 J$ Z# X" O0 [
Python读写文件
& O' b1 p& H1 B& E3 u2 s- G
3 |( G- X6 e% A' C$ \1.open, B2 F9 {1 x) W7 g: }. e1 C
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。6 Y& x) p+ @9 [+ P5 Y

( `' w% L4 J3 _8 y( U; b
  1. file_object = open('thefile.txt')
    # P' e( G8 f9 _; D
  2. try:. X+ P: W; m, N
  3.    all_the_text = file_object.read( )" _8 G  d! x  ^8 t) ~
  4. finally:$ D* e! ^; ~1 q4 B) E
  5.    file_object.close( )
复制代码

$ N# W) n6 ], U) O$ _9 X注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。# s" X0 a$ j8 k, A5 _, }

  Y+ F3 M. U. x- m9 s& C6 S8 J8 z2.读文件
# U1 P+ D0 T! t4 i+ E- n' H
& S; T0 X) f' T# P  p/ M8 @读文本文件3 s0 t4 S  p" V( C+ O4 @% Z
  1. input = open('data', 'r'), l# k/ a! ~4 R
  2. #第二个参数默认为r
    1 U( D' j/ M# v7 Z9 C
  3. input = open('data')$ _4 y6 H% ^, J" O! z' z9 Z
  4. 读二进制文件5 S( x7 J4 ?0 ], E. r) i. v
  5. input = open('data', 'rb')
复制代码
0 e) K  x* s4 r* P
) o: T, T5 r, j, R- `6 |: {, B
读取所有内容
+ C8 x7 x1 Z; x0 V+ y" f, D
  1. file_object = open('thefile.txt')/ @- h3 }- y) e( s8 q, a( C
  2. try:" f" {$ a( C; q- @* K  A
  3.    all_the_text = file_object.read( ). J1 k9 T- f8 O0 x0 }
  4. finally:
      e' M3 k# F% z6 x" m1 v4 P/ r8 \- L  G# m+ i
  5.    file_object.close( )
复制代码

% C. j( N  L, Z' g5 x+ e
( ?4 y2 o, j2 Q7 h# d读固定字节
: q. D, m0 _  L4 z3 \  K6 L. e
  1. file_object = open('abinfile', 'rb')
    * `: M" K6 ?4 a
  2. try:
    0 N. {5 c# s3 w+ @) F
  3.   while True:
    7 s. E( L* K" e
  4.      chunk = file_object.read(100)* f( p5 T. R0 M" y8 Z
  5.     if not chunk:8 L0 T% Q3 K/ R( C' V
  6.       break
    % t# S9 l" \; U$ |% g3 X
  7.      do_something_with(chunk)5 P" [: j( X$ O" E. e! C; R
  8. finally:
    # H# U" J6 o% Y  v4 S
  9.    file_object.close( )
复制代码

/ q5 t% B% n. U  _' U( u# x; Z0 Q2 y* j0 N7 e/ ^
读每行
! g; e6 z! q  f3 `
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
$ A& t% a9 S  w9 C3 J1 @
( g5 P- M! N( ]* T) g. L# f
如果文件是文本文件,还可以直接遍历文件对象获取每行:
$ a$ K- h: w' e2 e: l" C
  1. for line in file_object:+ _( Q& ?: S' I# U8 J+ R
  2.    process line
复制代码

& @3 c1 }) i. B- H
7 d" D/ J6 g) ~$ f" G3.写文件9 \1 e. x, C% `9 a/ y* U3 n

% F; W' z/ S9 t写文本文件
. c  r. _" x' a/ m+ r: G
  1. output = open('data', 'w')
复制代码
, Q! l# n; P% T( P1 I

( U0 M& }9 k: Y% w5 k0 p写二进制文件
. C8 _( I, y3 K3 S1 u
  1. output = open('data', 'wb')
复制代码

$ ~9 H; u* O9 r1 ?: V) r% z" a4 ~9 T; J: y8 |+ u
追加写文件
: z# m/ W$ {3 k/ }
  1. output = open('data', 'w+')
复制代码

4 w3 z* ~) f. M" T) \, z
  O. M, M! c$ s7 C( Y- z写数据0 ^, y' d9 [5 _: s' |
  1. file_object = open('thefile.txt', 'w')* F# ^7 A- |' y; E6 D; _* R
  2. file_object.write(all_the_text)% x1 G" }# i/ M4 A. Z5 c( ?
  3. file_object.close( )
复制代码

% Y( ?0 V) ?& h0 [
* U6 D0 E0 p5 g' _* L7 B写入多行
* h1 X9 J$ P4 k( Y% [' ]8 w
  1. file_object.writelines(list_of_text_strings)
复制代码

  R& @0 Q+ B" K1 T/ M5 `
( ?  l# u# Y  ^, x0 s注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
1 G& I  g- H. r  U* |0 ?; E/ A
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。3 g5 D: S, b, m# A7 n( `( D
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
& B# V' w5 ~6 e! l. B& V5 t
  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)
复制代码

" z" c+ @7 L) }' C4 ~每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
9 ~9 j4 ?* T+ g8 Q7 P
) ~1 ~) l+ U2 W: e9 e; tfile在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:- b/ S3 z8 c7 e! }: [5 p$ s( m
4 `  v. ~! R; O/ V8 x; q
  1. file(name[, mode[, buffering]])
复制代码

+ H. t+ |9 ~" Zfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
5 g9 V  x5 ^/ o/ L6 @& K& e( dmode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。( Q# f4 I8 c) m- H7 I
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
! |6 G, T9 d# E( u  t. J6 X: S
' m, ?$ h  u) @$ ~6 xfile对象有自己的属性和方法。先来看看file的属性。2 y9 Q2 |& S: g+ _) l9 Y+ U. G8 ~

4 z- V3 T; z4 e5 Xclosed #标记文件是否已经关闭,由close()改写
9 Q5 A" U  a) \) c3 i4 G4 v5 @; |encoding #文件编码. g: V  r* q# ]0 ]) U5 h! {( z2 u) c
mode #打开模式5 _, F1 ]( K) r4 M- y& P- R- d
name #文件名
9 e6 g! s- E/ @- r: B+ Xnewlines #文件中用到的换行模式,是一个tuple+ d$ G, o; o5 y
softspace #boolean型,一般为0,据说用于print$ K5 G( n& x7 ?

' G5 A4 X  G) X8 o. O6 bfile的读写方法:8 a# P) s) d/ A7 ~

5 ]& c: ?) @, u+ t. o2 a% cF.read([size]) #size为读取的长度,以byte为单位
/ e! f. @8 A5 c4 tF.readline([size])
$ |- |5 y5 l# N% q& Z# p; u( @#读一行,如果定义了size,有可能返回的只是一行的一部分
- j9 l0 y/ e6 ?* cF.readlines([size])
" n9 Q& n1 @! @- z- w#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。, S( r+ {2 g& ]# X& O+ \/ }
F.write(str)
, ]4 P8 @6 U' T#把str写到文件中,write()并不会在str后加上一个换行符: ^; p" l/ s+ F- W
F.writelines(seq)) X$ D3 J* ~/ Z1 @& S5 Y
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。" D3 o5 `6 l* ?% j3 `
1 v) R; i4 `, f2 b
file的其他方法:
9 y( }3 H9 N/ [# L0 c  f, Z. D" C- Q* O7 B1 v2 |4 V
F.close()
" w9 @" F" C8 s, S/ F0 `#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError, ]. H, `, L3 B  n/ L$ w4 ^
F.flush()
; Y7 e& q! _  K/ _+ j#把缓冲区的内容写入硬盘
/ t& e. W" z; g/ D: l; L5 ]F.fileno()
" ^/ H* d: T9 Q( c' s#返回一个长整型的”文件标签“
* J: Y$ {/ Z& n3 n6 SF.isatty()5 X# \  {9 N1 Q" J# H3 K9 g
#文件是否是一个终端设备文件(unix系统中的)
! P' m, b/ g1 W2 W6 o+ JF.tell()
# N7 ^6 ^9 ]7 n2 L! ~3 s#返回文件操作标记的当前位置,以文件的开头为原点
4 w' ^% s- Y$ M2 S1 E( _F.next()6 V0 j$ e; Z5 t4 N/ j
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。% f0 P2 i  Y6 V% x
F.seek(offset[,whence])4 T5 j9 S* @1 K. [; M# }3 Y6 V
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。5 `* _- w: E9 N% R
F.truncate([size])" L2 Z5 k4 A# l- G, \7 h  T
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
* ~2 Z& l4 s0 @3 y) U. v  V2 a+ F% x
总结
, Q' R6 k) q+ p3 O$ e* W; _5 v: e' Q, ?3 I, t  f4 N( S1 x
以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-9 00:19 , Processed in 0.078700 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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