新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

新大榭软件管家 V5.8 Excel版 微信版 发布 财务/仓库/生产/销售/采购/行政/人事/校园 客服中心 - 办公软件 - 网站设计 - 广告招商

新大榭镜像 - 官方Web实验室 - 加入收藏 - 设为首页 广告是为了更好的发展 欢迎我区企业及商家赞助本站 首页文字黄金广告位(赞助)公益广告免费发布

查看: 355|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法
3 \! N$ U! J' R: ~5 o! ]os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
1 M" h. @, J& }+ z0 t
序号
方法及描述
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()

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

+ v/ r& ~2 v$ n- a/ E- x' O5 R( J* D0 q
1
os.tempnam([dir[, prefix]])
Python3 中已删除。返回唯一的路径名用于创建临时文件。
2
os.tmpfile()
Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。
3
os.tmpnam()
Python3 中已删除。为创建一个临时文件返回一个唯一的路径
新大榭Python学习社区公益培训、Excel业务指导、办公软件定制、网站建设、网络安全;新大榭Web实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
 楼主| 发表于 2021-11-6 16:48:25 | 显示全部楼层
ps:下面看下python读写、创建文件、文件夹等等
1 y8 D$ c8 v' k6 t
1 T' P8 i: f% ]$ rpython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。( l, ]# x6 E7 {0 b
7 R3 n# }' O9 W2 n3 ?
得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
; J- |. k! d, Z( m3 X
. w( ~3 m* A( y0 x
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码
5 ^/ G  a4 V) C; I1 V4 U

0 E  B( W+ X9 ^! \7 F& k5 O% J) V/ J函数用来删除一个文件:
  1. os.remove()
复制代码
' F" z$ q) h" w+ V$ j4 g
# j% i6 k% B2 ?
删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

' J9 W6 W% f& j6 |$ q) O5 P* h4 X+ Z; ~- c
检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
- L$ g7 g1 ?6 Z- C( }; o& v

3 N: x9 L9 h, ]! m" w$ k检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码
& H  X" [/ P' T" F( g" k

& B  C! O0 S) A' n9 ~, O判断是否是绝对路径:
  1. os.path.isabs()
复制代码

$ A9 L! F) ?6 t2 P: b; u( k7 F% _* l0 N
检验给出的路径是否真地存:
  1. os.path.exists()
复制代码

) ~. h5 b; g- U/ ~# n0 V( x' Y7 J8 o  R' Q/ V0 I/ L
返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码
0 {# ]' I5 l* A+ |  N; ?
eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码
4 U+ Z9 s' d) q
2 k4 f6 B9 V! U6 w7 Y. O- `$ ~: Z) l
分离扩展名:
  1. os.path.splitext()
复制代码

6 Z/ L5 O0 {& v
. ]9 L* ^! R' A1 ^8 ~& H: o获取路径名:
  1. os.path.dirname()
复制代码
$ X2 ^4 ]( F* }

" C' G  o" U, ?9 N4 w( c获取文件名:
  1. os.path.basename()
复制代码

6 V0 d1 I6 }8 ~5 X1 @8 q; y) @6 t
8 \2 J6 J2 y* p运行shell命令:
  1. os.system()
复制代码
# K/ o" ]# t' j; a

# l6 k  [+ m. D9 c2 h7 F! ~1 ^  d读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码

3 H% b- Y* ~8 S- E" f+ D& K
8 L  s0 z* s6 \: i) s; w/ g给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
: C7 D3 {* h3 c& Z" P7 J# ?
) k4 u7 d, s7 `指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'+ x# U3 f! k* O

" F5 j# ~; E9 B$ G, s重命名:
  1. os.rename(old, new)
复制代码
5 g9 v9 H/ P5 a% h

0 O+ L- ]1 y# E# S/ I4 ]创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码
% X2 O' h. S; h0 [

. [/ z- c5 f7 O" F, N) k创建单个目录:
  1. os.mkdir(“test”)
复制代码

* `$ N; b4 A, M1 K: Y1 c* F4 T# p$ z! p+ u% `
获取文件属性:
  1. os.stat(file)
复制代码

! Y6 R1 ?2 u" y& R- y# L/ F  h) @$ F& |$ P
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

3 l7 l9 r/ t6 A2 N# d* V9 ]% O( @. S' P5 h
终止当前进程:
  1. os.exit()
复制代码
" O- Y6 P% `$ ]  ?: x

. d7 r/ P2 ^- y! f获取文件大小:
  1. os.path.getsize(filename)
复制代码

# |# s+ i7 q% v$ Z
# F4 K- @$ A) X7 b/ H文件操作:
- H) n8 g, ?  C, g. ?3 T! Z& m. `" x- c2 D
创建空文件
  1. os.mknod("test.txt")
复制代码

3 U; H' T; e  @% q  ]/ O- T% Q直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

5 b0 `0 ^8 _) ]; A$ `+ E
( |7 e. @$ J1 W( o& t: j关于open 模式:
8 b- T% U7 ]9 f* q: x0 v  kw     以写方式打开,6 E0 F* i2 S, u( u& I- z
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)' a' Z9 s$ g5 k& d( \
r+     以读写模式打开
9 E8 z* @9 v' aw+     以读写模式打开 (参见 w )
  @+ U0 }, Y, f, n# h+ za+     以读写模式打开 (参见 a )
- v2 g. }9 M' i* D1 `rb     以二进制读模式打开1 w; x- }/ J7 I! m' ]# l6 G6 P% z
wb     以二进制写模式打开 (参见 w )
3 p& j0 V, g8 n: _ab     以二进制追加模式打开 (参见 a )
, V, }5 J& i6 |8 o' z, s3 O% ~rb+    以二进制读写模式打开 (参见 r+ )
+ F8 k+ G, j+ _% v$ C. W1 _- jwb+    以二进制读写模式打开 (参见 w+ )
; O' {5 z) j" E9 mab+    以二进制读写模式打开 (参见 a+ )
2 [, s& ]$ F6 B+ p' g* _- I; q# I6 f" _
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
9 n2 I. {5 S7 K. K1 u( O
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
7 v2 b- V- W- n- I3 ]; K" C
3 `! R0 _$ I/ E" e8 g0 k+ g) M
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
2 M3 _  w3 d# W' k( X8 `9 C( Z2 k! C( L+ v$ h1 `1 Z
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符( c7 c6 Y8 e- N0 e2 E  [* z+ |* q7 P
  R) |' t# b( r
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
4 T- D" _; `1 ^( ^5 q/ C  l& B, F0 T- f# N- }
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError/ [  {: i4 F" ~" f) h) D( w+ _
: Y3 L; s$ D" w, Z
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘& H$ _' g) R' E+ I/ P$ F. G
# x4 q! i6 B6 U8 r
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“, P$ [. V9 `. i6 r7 r3 h* f
7 I8 ~/ Z0 H' r5 }* k: a3 a& ?
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
) ]  a! ~! f8 k( L
- _% S% N& F8 s: N
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点0 ~$ {) K& O- Z! i
- d  }, U# O! c
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
6 S- H. Q! g# \- f  i! ^* T
6 K" U! j" t1 L8 [% @% p* Z
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
% u5 x$ c. i+ ?1 i$ q: ^3 \% v4 K" ]1 Y! U2 y9 j" i$ p
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。& ~0 g' z2 w6 Y5 W0 s2 p& T5 v0 C

( s3 u" _  E9 J" N5 b目录操作:* l' V& L# f) G, a. \1 W
  [# O: k  F, H! b
  1. os.mkdir("file")
复制代码
                  创建目录
: T& y- s2 s' k# A& E复制文件:
& |, ?. j# y/ q4 H. ?% J4 B3 M
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件" g: p* J( n$ w
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录; v$ F) N) A: q) C. s, u
复制文件夹:8 V; H; p7 M' x& z' Y6 \
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
( A; A' H$ a8 h' n* O重命名文件(目录)
/ ?2 a$ z% c; C* ^6 i9 r! t6 \
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令9 T! ^( u& W) I
移动文件(目录)+ O( Q4 r* [/ a) H( i8 ^* t
  1. shutil.move("oldpos","newpos")
复制代码

% ^. N" {8 T2 d9 e$ \" g删除文件
/ o0 R0 |. b/ y. q2 x+ q
  1. os.remove("file")
复制代码
. s9 v3 `& r3 `
删除目录
9 N! s, a# [- `9 e$ V0 a/ o
  1. os.rmdir("dir")
复制代码
   只能删除空目录
8 V( u& c9 h3 ^
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删) O- Q$ N' Q  I9 k5 Q
转换目录
6 I2 t, \" C* m4 u6 f2 P
  1. os.chdir("path")
复制代码
  换路径
& t8 x% U' B9 J& m6 R9 F  i/ M5 o- G

* Z: R) d5 B6 LPython读写文件& \+ h( R+ Z  @. X: d& U9 x8 d
, a6 O; x" n0 U+ g) y/ f
1.open
" V  Z! k' C' l3 U- C使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。8 {8 l# O( Q, x

, k. P$ T5 n7 e2 e
  1. file_object = open('thefile.txt')
    # K+ A: k. p% |9 g: `# f
  2. try:' M: y& J. f: f* {
  3.    all_the_text = file_object.read( )
    & Y/ J6 u# ^- c9 k# W/ u
  4. finally:
    ) D- }$ B3 B9 j7 U+ W" a
  5.    file_object.close( )
复制代码

2 y- q8 ]5 {! {注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。; h4 J2 d8 L6 m
0 i- }; o" s& w. i
2.读文件/ x6 ], X" t+ ~# G
5 X) ^2 X# t9 Q  ~% |" J1 N" _4 n/ E
读文本文件
' g& O0 C+ A' T' p. \
  1. input = open('data', 'r')' _( E& z+ g7 t- F+ j; j; G. j
  2. #第二个参数默认为r, @4 i7 z1 |$ F; r% N  T- G
  3. input = open('data')  K1 R' J& b/ Q: f
  4. 读二进制文件
    & W* E6 H3 |* ?6 ^% p
  5. input = open('data', 'rb')
复制代码

$ p  i9 q' T$ n
& K& d/ i) a" S& o1 J读取所有内容2 Z; X$ C1 w- C! `% M
  1. file_object = open('thefile.txt')' m) f' o& Z4 E; D  Q% O
  2. try:4 e9 w# [1 _5 _) E( d
  3.    all_the_text = file_object.read( )( i$ c( t0 x5 N( W/ B0 _0 j
  4. finally:
    2 m! L0 p6 o4 }& Z# [5 v
  5.    file_object.close( )
复制代码

) W1 q' O( J( x% y2 O; K5 t* M9 L3 P" Y5 m
读固定字节
" x  c: @# n: m8 }) S5 {
  1. file_object = open('abinfile', 'rb')7 W( E3 C0 E9 m. ^' v2 Q9 L
  2. try:& @+ o# ~7 G7 k6 O; t" M
  3.   while True:7 U+ o+ f+ {4 A  w( y3 G8 l/ ^* U5 R
  4.      chunk = file_object.read(100)/ ~9 Y" L( X" K& i2 k$ F
  5.     if not chunk:/ \  h8 ^! t/ `# n8 g
  6.       break3 B6 H/ x6 b% E; l
  7.      do_something_with(chunk)( x$ W. N$ `, x. Q" Y' c" q
  8. finally:
    - ^: K" d# S- `/ }& Q- s% k% r* h
  9.    file_object.close( )
复制代码

4 \/ O0 z& [1 E/ s0 z/ L2 Z7 p3 @) @) o( L
读每行# H* a3 f8 N9 N+ ^) S, b
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
( o" a* _# A' V# e( ?
7 Q% ^8 k! g* K6 N! N5 _5 A. L4 ^
如果文件是文本文件,还可以直接遍历文件对象获取每行:6 [8 T7 d9 W; {" J7 P/ G
  1. for line in file_object:
    4 Y- m. {8 c1 I3 t
  2.    process line
复制代码
  W+ d: [9 Y( B# p! u/ M

1 `1 y+ M$ f( w. ^3.写文件
2 j  x8 \4 f. f) V5 r
7 E% ~4 w4 W1 z9 q  t写文本文件
+ R/ c: O/ b! ~; o+ }# s. w( v
  1. output = open('data', 'w')
复制代码
" ]2 H( C3 p$ A: `: A

( i+ ?. F+ g6 N7 j% b写二进制文件
1 A" S# c. T; ~' V$ w
  1. output = open('data', 'wb')
复制代码
3 `4 ^: p5 Y" S) J3 y0 m

8 A- L3 j$ Q$ U# \. O3 N' }追加写文件
1 j/ s$ f- w* ?" J4 T& r& A
  1. output = open('data', 'w+')
复制代码
# o" M7 \. B/ X5 x2 C( h( K

/ q8 w$ ]$ q$ h: A写数据
$ v. U; V4 W4 j  [) @( E, A; }3 C6 z
  1. file_object = open('thefile.txt', 'w')
    7 I" [3 d4 I' ?' X
  2. file_object.write(all_the_text)
    / S) U) j/ ^0 m, m+ L# b' [0 o
  3. file_object.close( )
复制代码

6 k# Y6 K9 `  c  [, N7 K
7 m, t; l. X- \* m- [6 h% ?写入多行8 p, B7 b3 c' d% {0 \4 c3 F7 r1 n: ]
  1. file_object.writelines(list_of_text_strings)
复制代码
# l: p  W* ?. e8 `0 F

3 c; `1 D: I, x& S) V* l6 B0 F( F2 b注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
9 P) u6 }# E( ~
* s! B5 Q0 D  I) l( j在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
) ^( X! k5 a/ N6 k! D. q在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:9 o" F" O% k* A& |, E  t# c- B. G
  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)
复制代码

  v. Y4 {/ k. c) K5 E, X- `8 `每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
' X$ |. _" p2 O" ]: t: z2 D
6 E! l& _, S! Y( k. nfile在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
/ F7 _8 z1 J: r" L
, z" u2 |3 y% _% C9 ~! U6 Q* ~
  1. file(name[, mode[, buffering]])
复制代码

. ]! r, f3 ^9 z7 d+ P1 tfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。( e+ \$ r3 p$ x, B2 p
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
5 Q$ T: \) H7 |& `$ |8 L7 Z& Ybuffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
4 k" t: V& Q$ H2 M; r
. U/ C- p' S) `  b9 Lfile对象有自己的属性和方法。先来看看file的属性。
9 e& X" A9 k" m3 {( J# Y5 i6 G
! }9 d3 q! `( t0 Jclosed #标记文件是否已经关闭,由close()改写) t# F  \- j" c+ ?6 F' }6 P
encoding #文件编码
* k, h" L8 a9 ?8 [6 wmode #打开模式
* L& A7 z7 d4 u) g2 W; D. b: X5 H( C- Yname #文件名( f! N: d  L( T" @; Y  B( @
newlines #文件中用到的换行模式,是一个tuple
% }4 c: Y6 O6 ]2 R9 ]/ hsoftspace #boolean型,一般为0,据说用于print
2 a2 c( I3 r5 C% v+ Z5 ~. d0 b% B' h1 g4 C9 e+ R) {$ M! ]
file的读写方法:
+ p' t; `2 ~% ]& e/ R
8 E: @8 N# C- ^4 x$ e6 }5 xF.read([size]) #size为读取的长度,以byte为单位) K4 E. _8 Z( r/ {5 \8 Y
F.readline([size])
( b' h3 D& a% h7 P: g#读一行,如果定义了size,有可能返回的只是一行的一部分
; d! u( B0 F) ^; K1 L- {$ H* P) tF.readlines([size])2 K* G% `4 M+ J
#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
6 j! c$ d' ~. J$ \* o% v+ B& T. LF.write(str)
# b( V6 R) ]% s3 z9 V3 T#把str写到文件中,write()并不会在str后加上一个换行符; D$ G. m+ d$ F! W# \9 i4 w6 F2 V2 Q
F.writelines(seq)' p4 ]3 Y" d# \) A, L1 X
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。% J+ f6 {! ^1 q, D
' d' M: Y1 L8 N3 C( a* h: z
file的其他方法:* G1 P0 i' U" n
0 X2 [. u% w) @6 r9 d
F.close()4 J' o7 \3 M9 B
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError2 W7 A' `6 y/ ?" Y  X
F.flush()
" i9 i' Y( L( u#把缓冲区的内容写入硬盘
2 F6 P: |- m6 s9 i6 b$ ZF.fileno()5 X2 m) A. p6 J' p
#返回一个长整型的”文件标签“
7 e1 Y: h- }, B) |F.isatty()2 m# f* `0 ~$ N4 w4 ?9 S
#文件是否是一个终端设备文件(unix系统中的)& w8 e. @) B& }7 h. B: G, E
F.tell()1 L+ C4 u  G& p5 d* G' ]8 Y" B
#返回文件操作标记的当前位置,以文件的开头为原点
2 s& R$ A/ U5 I. |* W- _F.next()
( a- [- o& U2 F& o# H" T#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
9 o) ^, g: D& z4 rF.seek(offset[,whence])  ?2 Y& q) ~6 |) V" D
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。1 m2 i6 J: k* k" c; f" o% L
F.truncate([size])
7 z# Y6 P2 L: r#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
- ]! m4 _- u  \& w# E0 K5 e/ v
2 F! r2 Y( Q6 \# [总结8 h; q2 h0 `; |& H8 |) ]/ i

; X  y: M) [" c: i以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区公益培训、Excel业务指导、办公软件定制、网站建设、网络安全;新大榭Web实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2024-5-19 17:29 , Processed in 0.076773 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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