新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 598|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法3 |" ?3 k8 ^: m- d3 V: c: S: q6 {) ~
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
2 G  |( Z8 m1 x+ V. }# `' a
序号
方法及描述
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()

// 获取当前目录的父目录,以字符串形式显示目录名。
) X/ T; E: c' U% @& t- Q4 U7 O6 y% N
, a8 \# F% A& z  T5 c, O# h* F
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读写、创建文件、文件夹等等
; G8 r6 T+ ~- i4 h
3 H( {8 U, \1 ?6 ppython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
2 I1 _4 J  P  `! I' u1 J5 y
9 ]* {+ U! ~* d% z% X9 k) Z& h% Q得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
' K6 {# A6 F  ?9 G
! E/ b- h' Q1 J5 Y5 B/ ^4 d' W
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码
$ e6 K- F* ^6 i! I' b
$ Y7 ?6 _: Y/ E8 x. N# q
函数用来删除一个文件:
  1. os.remove()
复制代码

5 F9 f) Q  u7 l" o
6 v6 v! B, K. E) x: L删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码
6 c0 o% y0 g2 z
) s( h( u9 V& X0 u4 x
检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
4 i0 z) Y2 k+ p5 d

* J4 Z2 j' F9 v) `& C, Z9 p检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码

# n" I" _* i- K/ m/ i5 k
. Y7 T/ U0 S( c% Z& e2 s2 s判断是否是绝对路径:
  1. os.path.isabs()
复制代码
: u. v) e( r* T: c
, a) h6 |1 K* J1 C
检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
" ^$ {3 p; ~1 q$ ~+ |
) K; |) }: M) B4 N( e, T1 @
返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码

  \- F1 y$ \4 M, j: ]eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码

& f8 K" H/ k6 _- D* z( K3 @/ r2 E/ P$ X" G0 w
分离扩展名:
  1. os.path.splitext()
复制代码
2 q# B( @7 `& K5 U- M; z% C% ?
& k" R* ~/ k8 a; A; X) \! v
获取路径名:
  1. os.path.dirname()
复制代码
$ i4 @7 Q$ h& ~( |2 x- c( f) R% R
' [; @' T6 c6 x9 S
获取文件名:
  1. os.path.basename()
复制代码
: ?7 n$ E. x9 G! ?& m* v. y4 d

5 m! c5 g$ m7 b4 F+ h$ R0 T, d0 U运行shell命令:
  1. os.system()
复制代码

8 T& ]# `$ i) \; a2 b3 B. P* e, a  Q- X. j- Z" k, w! S3 P4 v
读取和设置环境变量:
  1. os.getenv()
复制代码
与
  1. os.putenv()
复制代码

% w( S- e5 _7 @- ~4 }* _3 W. b% ?2 b9 a6 Z
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
% J3 C% v5 B9 L- G' D
5 s' w1 T* o; M/ \指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix', ~' k! j' Z. U( L9 G7 F: }

' A. S5 m, q! n, x9 O9 @! y& w2 ?! o重命名:
  1. os.rename(old, new)
复制代码
, b* ?4 b# F# V

4 s) k  F( }5 j6 {创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码
: P% _6 u  [' @; d, ?

# t6 L5 w6 x1 G# ~5 N; k% o创建单个目录:
  1. os.mkdir(“test”)
复制代码
, g. p" C; A. O8 k: S' ?) N
9 N, k/ i# \) c5 b/ O1 \8 D
获取文件属性:
  1. os.stat(file)
复制代码

' r* j% p3 k  u' S' O" e7 Z/ V$ {2 V" W* v/ c( [6 l
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

( s4 S' c- Q- V" S
7 m$ i( S" r% f! O& {* P3 r: f2 a终止当前进程:
  1. os.exit()
复制代码

% S+ |2 U4 a# E& A/ h2 u. z
9 o" C- m0 M% C获取文件大小:
  1. os.path.getsize(filename)
复制代码
. E5 D) L' G$ n. T9 S; r
6 l* P6 K  `" r; K7 X  i" ~
文件操作:
0 U9 f. r2 G- I4 G# o. }6 T# x) F
2 k, Y2 @/ S' L创建空文件
  1. os.mknod("test.txt")
复制代码
' d4 r1 a* v7 S! K6 _- k
直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

& q% h5 s. x) E4 z# G2 m6 R" D2 F% s6 v
关于open 模式:2 X* k/ V/ d" Q& \  N3 |( d
w     以写方式打开,$ j9 \2 M/ ~( P0 |9 ?
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)( O3 b  O/ v9 I9 k, h
r+     以读写模式打开
% _  S) L1 b: o6 U; e8 a; Qw+     以读写模式打开 (参见 w )
% I- ^1 `: n% G8 Za+     以读写模式打开 (参见 a )# j. I, k) `  Q* [( J" y
rb     以二进制读模式打开
- j. u( z5 g8 G, p2 Vwb     以二进制写模式打开 (参见 w )" ^* u# L$ R7 Q/ K2 z4 F' [0 R
ab     以二进制追加模式打开 (参见 a )
1 O& Q0 _1 {% K! b' ]: T5 |# Xrb+    以二进制读写模式打开 (参见 r+ )2 R' J, k  w; b* c$ t5 O
wb+    以二进制读写模式打开 (参见 w+ )
1 p2 |5 z: O0 O4 q% {ab+    以二进制读写模式打开 (参见 a+ )
/ R- `) K1 g- d. |4 `# B0 z
4 s; n. ^1 u+ ?( T+ U  @1 ^
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
+ m  ?) g) J/ C) ~' F
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
* P! M3 O0 m; i
, `; I1 S( c) o' Z9 J) B0 @' L7 p
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。0 i) \% i  d# d5 v- N. |9 h" I/ f
1 Q: Z  e6 G, V2 T! H6 V
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
% n+ M$ J$ D2 T4 A8 R
) |8 H( [) w8 R
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。8 u/ a" r, |& e; p) g0 _
4 a6 J$ l- B: d; y
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
% c% X0 j; X; x) a; J
$ R# @/ ?# V9 z
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘- V  J. l& E! D: A1 E. v
: k% d# C" b1 L  u
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“. t, `5 s& r! R+ N0 E

9 w0 H: O% \- f" u* W5 K: p
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
( }$ U, `/ y9 Q7 Y+ V0 i9 O, q- \: y
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
) m% A" p8 w9 T
# F9 b3 d4 S  ~- z' Q5 A
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。% o$ F7 d9 S+ w" i* A9 v2 y

. j! o+ D3 u5 c, Z1 q' }1 c* r8 A) @
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。$ U1 @4 l+ H& K

# k- |5 f3 z" a% R5 {0 v# Z
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。* c) Z8 n% Y& s3 H- q" L5 i
: T$ P( {& m( S
目录操作:, F* _0 H  t+ ^% G! h
! b. r3 y7 B  u( O
  1. os.mkdir("file")
复制代码
                  创建目录
; H% M2 `; c# j1 o/ X复制文件:/ x/ w( E4 }( ?
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件
5 m, b/ a' X2 C4 p$ Z+ K; N; j) Q
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
. f9 Q2 P7 s( a( C复制文件夹:
6 R' ~+ l, ?9 o* j) J
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
5 ~/ |7 R9 x5 o9 r3 M) D6 T6 ~重命名文件(目录)
  I, q8 Z' F7 `# V* \
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令; j% K, i* k5 P- C1 C0 E( t/ N
移动文件(目录); V) h+ D7 C4 g& L
  1. shutil.move("oldpos","newpos")
复制代码
1 T% l. E+ o' n' Z+ e/ n4 x
删除文件
3 [% ?. E7 p! n
  1. os.remove("file")
复制代码

: D- b, s/ l" K$ m$ [) a删除目录* W1 ]( N2 G4 }! @) W, \
  1. os.rmdir("dir")
复制代码
   只能删除空目录
, ]7 @4 V7 U- p2 R) m0 n
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
. j3 x. `. k$ @6 y转换目录
6 m* Q/ [0 z; U# Y/ X0 e
  1. os.chdir("path")
复制代码
  换路径
, V. S  G0 J# T* F$ j/ }) Y/ p- o$ B% G/ n% f- R$ }

0 q; t" Y$ H. z- c9 B0 OPython读写文件
+ u* q5 Q$ W4 S  Y  u7 j! S6 s5 M% e1 W8 l$ L4 j
1.open; {" z7 b2 W# l
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
* u2 o1 _3 W* t- U! O) f$ P" P. s6 Q. Q. |6 S6 |: F
  1. file_object = open('thefile.txt')9 w% }- x. u+ Y# [
  2. try:: Y0 z8 a& r7 O5 l
  3.    all_the_text = file_object.read( )' ?6 H; G5 ^+ Y/ N& s
  4. finally:+ S  }( r9 H% `% f+ j
  5.    file_object.close( )
复制代码
% V: B3 j- k+ @! e, W
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。! I$ z( R  [0 D
& T# z  o: O- K% O2 _
2.读文件
; D, L. n0 T* p9 l) {
' z0 {/ n6 k1 l! B- h8 h读文本文件' A5 y/ Z& S8 M6 i7 r6 u
  1. input = open('data', 'r')$ S# }+ a# R8 E( j  c7 q1 b/ J, S
  2. #第二个参数默认为r
    5 a( \* W: r& Z  A/ P8 ~% |
  3. input = open('data')
    ) M. a3 s: U/ C9 g+ b" D! j
  4. 读二进制文件9 p% \5 `" g. Q, N
  5. input = open('data', 'rb')
复制代码

( a* q0 g6 Z- z+ i( W$ r. k. a+ H  [" }$ r  v! P% n
读取所有内容( V% y: S3 M4 W% l/ D' y1 w
  1. file_object = open('thefile.txt')
    3 @7 }0 y# d+ d$ l
  2. try:% l# z6 r1 O* o6 n2 t3 v
  3.    all_the_text = file_object.read( )
    3 v, j" f! Y! `; p+ T$ n3 O
  4. finally:1 [- T/ x% _* t  J: K$ e% \6 \
  5.    file_object.close( )
复制代码

% H5 ~+ m' y+ N! i/ q! ]' G; W1 T3 E& B4 W6 K, t* p
读固定字节
$ m8 F$ n2 {+ b, S6 B. b4 \3 p% b
  1. file_object = open('abinfile', 'rb')
    7 ^0 b3 t6 }8 p9 N
  2. try:. J3 f5 Y: _7 ^
  3.   while True:
    9 S5 r7 X" x8 Q2 L1 f( k
  4.      chunk = file_object.read(100)
    ( _* ?- z! @# Z# u' [) R$ W& ?
  5.     if not chunk:
    . b/ d# ~: c. s5 g
  6.       break! H, w6 G( A, \/ B2 A
  7.      do_something_with(chunk)* Q$ Q* L% g8 F* ~
  8. finally:
    3 `$ m4 K3 T( i+ {& }& }7 T) k" S
  9.    file_object.close( )
复制代码

* {; }+ t) e" O' ]) A1 r
2 [. O0 Q# [4 L9 U1 x9 E读每行* \! M5 k& L' r2 n1 F( d
  1. list_of_all_the_lines = file_object.readlines( )
复制代码

! Z/ f- i) T: n; p! i9 o' y2 ?2 w' r1 e5 ?2 w+ r
如果文件是文本文件,还可以直接遍历文件对象获取每行:2 Q/ E' Y- Q0 R$ p( X5 i
  1. for line in file_object:5 k% [3 H" E. f  K
  2.    process line
复制代码

2 h4 O3 Y3 }! \+ v; C5 f. v1 F5 `% u0 B" g8 w
3.写文件
9 ?! u: @) A5 s6 s2 K7 h9 X( g/ N8 Z+ k0 g4 b
写文本文件1 {5 \  q% z, Z- Z  L
  1. output = open('data', 'w')
复制代码

0 [6 m& x1 L7 U5 U* `3 t* i/ m* J# w8 O/ B- t9 k( E
写二进制文件6 t9 f# K) U# w* l8 t/ H: v
  1. output = open('data', 'wb')
复制代码

% i* G. \: J0 t+ Q' H4 j3 y# Z- Q" a& A6 D/ B: ]
追加写文件# d: q( _' P3 I1 ^* \9 D
  1. output = open('data', 'w+')
复制代码

: y4 q+ m" s) i+ t# ]3 H6 E
7 p# A, U, o- b7 `; S2 Z+ N写数据
+ t: Y4 E/ v% d% X. P
  1. file_object = open('thefile.txt', 'w')' w# A" B& b+ t: l2 ?2 R
  2. file_object.write(all_the_text)7 l( ~1 X4 O2 {1 n, b
  3. file_object.close( )
复制代码
: p. y/ c  w$ o. o- M# o
% h, I/ U9 B6 x7 l6 B
写入多行; P) X' f0 f9 p0 j+ t4 u4 G6 M
  1. file_object.writelines(list_of_text_strings)
复制代码
  _- m% l2 T7 q$ K/ O" m6 }

( W- z/ Z2 Y; @8 I/ f注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
  z/ y0 v9 q1 a/ @7 D: Q' q9 r6 E& Y( s4 Y5 i' D
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。0 A# u( D7 X4 S+ y1 q2 D; g& d
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
0 a$ O4 D7 V! 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)
复制代码
% o1 x6 y  G9 {2 @* {% O' L) x  C; k
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。/ [1 c7 n* N- @5 q
# `% Z$ b- j4 K' D8 Y
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:/ j6 \6 z, K# w9 S9 U- C6 U% W
) b$ |) C& o7 K
  1. file(name[, mode[, buffering]])
复制代码

+ \, N7 V8 T' v2 w0 i& ?* rfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
& p! u1 |1 Q! i4 w( c( bmode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。+ }! S. \* H. V
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
6 L! k& p2 y4 O- t
0 t; v8 q/ x+ P2 B+ a; `% l: d1 H9 hfile对象有自己的属性和方法。先来看看file的属性。# z* H, J* c7 g) a

5 @, E4 m/ v' l0 l& aclosed #标记文件是否已经关闭,由close()改写+ W1 q0 F# I, T% b& s: K2 E+ p  E
encoding #文件编码- I& `% o2 B! |8 e- S8 a
mode #打开模式
3 \; {1 }- u; _name #文件名
8 Y" m. f: ?8 c/ X& W' C* e8 j5 enewlines #文件中用到的换行模式,是一个tuple2 f. \" i4 g4 s" w" v% q: C
softspace #boolean型,一般为0,据说用于print
& O* Y6 v9 u/ Z6 t% `; k" ~2 d! h0 A5 s5 {
7 F  z- x8 ?5 w2 V1 u9 Y& Nfile的读写方法:- M9 T. }! U- L

5 W5 }, k& i! Z* k$ rF.read([size]) #size为读取的长度,以byte为单位
8 a' A6 r( l  {2 t1 E3 w, u" LF.readline([size])
- C7 K5 N3 W8 n#读一行,如果定义了size,有可能返回的只是一行的一部分
4 m2 @  \$ G' I* \# q+ P# N& @F.readlines([size])
; H4 R2 _7 f' k. D! ^3 H" v* l: L#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。1 ]: E' r5 s2 S
F.write(str)
+ s; Y4 Z, c( }  }; G; U6 `2 U& E#把str写到文件中,write()并不会在str后加上一个换行符
% Z1 q8 x6 _  j/ c! SF.writelines(seq)
+ l1 i4 I" F8 g% _6 N; p, l$ u#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。! w) ~; t# m# o: U

3 ~, O. Q+ ^6 u9 H5 Z9 Afile的其他方法:( C# m( b/ `. n8 ~7 B/ K9 ~: n$ s- l

- ^8 y1 @7 f- I8 P) c' ]3 kF.close()0 }- `: p+ x5 r
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
/ s' M, R, V3 r1 i, ^F.flush()% q# V( g  \4 D0 n3 r5 J$ R
#把缓冲区的内容写入硬盘" W- _! K, c9 H- E  d
F.fileno(), S+ o1 C% g9 A! b
#返回一个长整型的”文件标签“. d: m* \# @% w% q# U/ q' ]: y7 v
F.isatty()
" l' n: l  E7 \; {: h. l- _3 E#文件是否是一个终端设备文件(unix系统中的)+ s0 o+ o9 f8 N% V6 ^
F.tell()1 l, i" M+ z5 B+ h* ~
#返回文件操作标记的当前位置,以文件的开头为原点, o7 W( a6 N8 T, Z( Q/ {- y; T
F.next()
; q) z8 V/ I7 k+ r#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
. _9 \$ w6 R7 a- h% L7 _0 M8 C* bF.seek(offset[,whence])
4 a2 r1 o4 T) k# J. q#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
: r' x- p- a9 d8 ?3 N6 xF.truncate([size])- `# P5 U; I; A$ C. P
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
* {1 Q& }: X' C5 }4 ~% a( f( l  |0 a  L  J1 g& V) F
总结/ ~; }8 v  n4 Z
3 z/ h2 V8 C6 }' d- E- u  n, M# c
以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-8 23:44 , Processed in 0.089064 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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