新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 527|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法# ]) g1 f% ~5 f; Z8 ?
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

' i' Y! b  T0 @3 N
序号
方法及描述
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()

// 获取当前目录的父目录,以字符串形式显示目录名。
( [6 m: |8 p- L: r/ ^( n

1 `6 b4 s. b  ^* H% y
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读写、创建文件、文件夹等等
+ o/ L' ^3 u# |4 c$ y
' M; }8 B' O8 ~python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
$ D- K$ L: n8 @  ?
  ^8 S% D% ^7 A得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
4 F; h1 _3 O8 A8 i/ e+ h

, }$ W/ V% E# f) }返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

, ^; y5 T4 ~2 h, F+ [$ {! G) M, V1 ~' m9 Y$ x
函数用来删除一个文件:
  1. os.remove()
复制代码

7 g# c7 `6 i& N2 {5 j3 g& H, m: D+ J+ H- _
删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码
: x6 M7 `: \  u$ {

' {5 z' _5 ~! B8 `7 U( i: U( g$ x检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
, |/ |, L# [, g

! C$ }! g- w6 E' H. L, p% `+ K+ @7 y检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码
& {: }- s* [1 [) K* \8 a( N
  M0 ]  Z, E, z: _
判断是否是绝对路径:
  1. os.path.isabs()
复制代码

( q% I: w9 x4 U5 S
* t8 F3 P4 u  ~" W  N" T/ x( f检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
. [) e7 Z4 o( Y) F  V/ y1 A

4 l- c) Q+ |. Z8 w; f4 o# z返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码
* z$ f9 G: D5 E. ~/ J- S. y
eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码

# D  l0 x6 @( F( e& B: N$ P5 ?. Z# ~0 s' C; b* P( B4 _1 a
分离扩展名:
  1. os.path.splitext()
复制代码
* i# Q" k/ l0 q5 U/ }) S
. x1 w. X, A3 f% @" c
获取路径名:
  1. os.path.dirname()
复制代码

  s7 D/ }; `1 o2 X; E& k- C: m) r) R; I, V3 {$ y
获取文件名:
  1. os.path.basename()
复制代码

: o! t/ E2 p9 @0 F; U. _* K1 a% B5 q! _: q0 o& U+ s0 g) o
运行shell命令:
  1. os.system()
复制代码

1 d$ r; }. O" K  e
/ l8 Y  Z+ ]9 J% H, `' s读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码
+ R& n! S5 o) K& G6 U" J8 n
4 R4 p4 X4 k5 v, F9 O0 _  n9 |
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
4 h1 k2 n/ O3 J: _; E' S
% F( a5 V' W# U" M) ]/ j指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
, t+ E4 X6 b0 q+ I
  m8 Z7 j& I) A# A重命名:
  1. os.rename(old, new)
复制代码

9 X) r) P8 f% B/ e! P6 h/ u0 O5 Q2 w7 w+ e3 @. j: n' g
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

) x. j* M4 h! t# u' D. {. F- O
3 k7 F9 `0 U! n5 i" C  @创建单个目录:
  1. os.mkdir(“test”)
复制代码

: E: F4 @1 Q% L1 |) m' J0 y9 i: W& g  Y- y! [' p4 ^5 s; ]9 i
获取文件属性:
  1. os.stat(file)
复制代码

( O5 n5 R: ~  n
8 s4 }" g6 J. I1 Z修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

! M6 u5 R- j& N2 W# F: o& d) F
! M# z7 O, d; q" m: a  V终止当前进程:
  1. os.exit()
复制代码
$ ]+ o) d4 n% a0 ^8 {" e

9 x0 s3 ?: B( `: [& v+ Y& H获取文件大小:
  1. os.path.getsize(filename)
复制代码
& P# q# J2 P; W

2 u: [3 B1 `3 z; x" H; s* a$ h文件操作:! W$ [  ~# e, q& a( g, w
: ?( B5 z! Y" C; \5 m7 M- h+ j
创建空文件
  1. os.mknod("test.txt")
复制代码

" x5 \3 y/ Z' x4 ^) U1 v+ \直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

# j  t, R9 a2 ?; O$ m6 y1 G; D0 C+ n, ?7 [% m
关于open 模式:' H- Q" W8 F9 Q" q3 N
w     以写方式打开,
4 ~) [' m! C, p" {a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)
3 w6 M0 Y7 ^' s1 g( w. Ir+     以读写模式打开
2 k7 ~& ^9 q; Y6 l+ Ww+     以读写模式打开 (参见 w )
# L3 ]+ r0 C# }a+     以读写模式打开 (参见 a )- K" J$ f# A& \; F
rb     以二进制读模式打开# v% D" u& x( \& V; J7 i
wb     以二进制写模式打开 (参见 w )
& K2 ]2 W" w, ~3 D) s4 G1 a" Lab     以二进制追加模式打开 (参见 a )& r% D. }$ K7 u! P, S- l1 |" M1 d
rb+    以二进制读写模式打开 (参见 r+ )( d/ m9 }1 e' H; q
wb+    以二进制读写模式打开 (参见 w+ )7 Z% o' l% `( Q8 `
ab+    以二进制读写模式打开 (参见 a+ )
) z: M2 C$ n. W3 w+ s
: N& J& |. B) ^3 g4 X% I$ c; U
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位1 M+ e9 }% n7 P; V1 A6 F, F
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
4 m, ^; x3 w" M  J" u
+ }1 j+ o4 J5 |' }# \
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
; a# o4 ?: s% ^* z+ T. K( n! r
( ?4 Z+ g2 W: k; p* J9 Z0 J
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符" f: ?$ }; J0 Y5 D

" g7 Z; ^0 F( o( ~8 f! v. W
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。) V1 `6 a/ \$ a) K+ y0 m% ^# O
& a% R- {$ @$ G: m8 r# a
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
/ z* n, R  L  p: l1 [/ |
, d- Z+ S3 d8 v$ Z! X  N
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
2 p* q# a; N  W0 l( {0 y2 R 6 w/ t  ?, W; A. ^" n
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
; D9 D. `  R0 C2 ~) _  H
, p& X+ ]% X9 p! E& q" K
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
* |/ ^9 D- o6 `) k+ o/ H
5 c8 A+ A3 b8 G2 T6 u
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
( a: L" ?" _0 |. o; `$ q; ]3 h3 }7 {) q
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。$ ~- x/ ?  k9 W$ Y2 C- O1 I  o% D8 j

7 w' i+ ?- \* Y% W
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
; I3 ]. [( U/ X* |# y
; k* P/ B5 G; V
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。6 |  t2 y: @7 ^/ Z5 o
6 _7 H( U3 A) Q0 j; T5 h. z. H3 Y
目录操作:
7 F; p/ [+ d) A) [) F
1 W4 {5 H3 A' L$ U: J! I/ t
  1. os.mkdir("file")
复制代码
                  创建目录* T  }$ U7 t5 R
复制文件:
. P" x9 X  E% x$ ^) K- s' P2 u
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件' k8 r# _0 P% F/ \* T- i/ W8 ?9 m
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录6 H6 y$ O* J8 M$ s" A- n0 I
复制文件夹:
' Y( A7 w  d8 W8 E% w5 _
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
( S# m4 ]0 A; A& E重命名文件(目录)4 r; \: @7 Q# V# F$ X
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令/ |2 e! b. x$ C; }/ o
移动文件(目录)  t, A5 l5 g0 z" M0 d
  1. shutil.move("oldpos","newpos")
复制代码

3 x4 x  b! W4 p  }删除文件& I7 V  q( ]5 k- p' h
  1. os.remove("file")
复制代码

+ O" u" E9 ^( v( n4 s) K删除目录& j# E) Y5 G+ n# K4 N/ i" `; V
  1. os.rmdir("dir")
复制代码
   只能删除空目录3 q4 C; @& r5 C# T: `- D+ p; R0 J, i
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
8 A' S5 j( [- e. j转换目录" b" r4 Z+ ^1 S; h7 c
  1. os.chdir("path")
复制代码
  换路径
- ]5 i, X% v2 N4 C  p  S& J$ W: L: w! E# g7 g4 Z5 m

" M. R1 Y4 u0 p2 H& q! D  APython读写文件
0 w) |" [+ p1 O+ P; A- |2 [9 D( ?
0 B/ g- U; A0 l+ M$ N  b+ |6 x1.open/ v+ y. U. k, `6 E+ ]
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。5 C, c  ^; R5 g9 E

- ?) z, d5 H; E8 I
  1. file_object = open('thefile.txt')
    $ ]4 `1 T. K& f' b$ k# ?
  2. try:
    ) E0 |& v6 G5 a0 D- f% @
  3.    all_the_text = file_object.read( )' Q! b& ^; `5 {( }' K8 P& O" ^
  4. finally:0 @* ^! Z1 g2 P; U6 h: M
  5.    file_object.close( )
复制代码

* J% l% N/ }2 ~8 @% ?! q- ?4 ^6 c注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
, K; ^! r: Z( l" u
' H, v% E) k9 w5 h* O2.读文件
& B& F# B0 V6 n- p8 Z
9 |; Z! Y" \/ F0 Q! U7 g( ^$ O读文本文件$ u5 B5 Q5 g6 g2 ^( ]. _
  1. input = open('data', 'r')
    * R3 P( y$ G& y8 J0 Z" S' i( W. I& b
  2. #第二个参数默认为r
    % V/ {# Q7 h" B7 `0 ?7 J  h$ }4 W) {
  3. input = open('data'); s5 z( T/ y' \4 a; O5 w; b
  4. 读二进制文件& L9 K& b  e7 S- i# x2 c% A
  5. input = open('data', 'rb')
复制代码
( p. g+ n. ^/ @
8 ?. [- f. k# |6 `3 q
读取所有内容7 V9 H+ j7 w, X4 G3 M3 r- r
  1. file_object = open('thefile.txt')
      ~: t# X- S0 l8 ^/ n& j' b3 L
  2. try:
    ! r. y/ j  n5 N7 P5 H: E4 o1 `; @5 m
  3.    all_the_text = file_object.read( )
    3 X* j: Z: Y3 N! l
  4. finally:
    " I) T- _* [8 z, E$ l5 X$ }
  5.    file_object.close( )
复制代码

" j: K& L  ~# i% |/ m' f7 e) V; y
, z/ V6 o4 l: |读固定字节
* F; l6 T+ a! H/ ~8 l9 s
  1. file_object = open('abinfile', 'rb')
    9 D4 N7 V0 W8 r' H
  2. try:7 ?5 D5 v( L/ J  r9 B% `" j# a
  3.   while True:6 J& E. V2 V4 ^0 G0 t
  4.      chunk = file_object.read(100)
    ' p: G- @% p+ @! b
  5.     if not chunk:
    7 n1 z$ Z$ A) h+ J( J8 Y
  6.       break# f& H- G2 g- w  W+ s4 P- q5 [
  7.      do_something_with(chunk)
    & [4 S$ t+ b" O! E- ?# R. w
  8. finally:
    $ q/ G; d& g9 L5 i$ A$ e$ t3 u. ]
  9.    file_object.close( )
复制代码

+ q! w- ^1 t+ J
( M4 f3 M+ ?  H: V/ q读每行
' G: X8 @# @3 C8 q9 |/ ?
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
* H$ J, Q1 _- {& k" n# ^/ q
0 U6 q9 |2 z$ ]6 a- E
如果文件是文本文件,还可以直接遍历文件对象获取每行:
- B0 i0 b3 M  x( C/ D( J
  1. for line in file_object:
    - o0 ]% _$ n' }% ]6 K2 l0 K* _
  2.    process line
复制代码
9 \% v2 \" y1 p; m2 ?& `
! O# ]7 }2 G; [: d& L2 |
3.写文件
" L- \9 h9 V3 j. z" z3 P. v
) ]) A# Q& W3 c写文本文件0 y$ D" Q1 @0 O* w: G
  1. output = open('data', 'w')
复制代码
! O9 R9 `+ r3 v! p4 N) `3 p
0 Z$ B6 P* g" {
写二进制文件
- D: c# T% K7 L  A
  1. output = open('data', 'wb')
复制代码

1 v) I0 s3 K' K
/ g! h2 ^3 p0 j& w% w追加写文件" o/ s5 m5 ^2 I7 M8 k5 O' |; Z! A
  1. output = open('data', 'w+')
复制代码
3 Z# I0 H8 h! r* e

3 A+ a* L- j( q3 D' F# X写数据0 O3 W/ x( @+ B2 ]. A
  1. file_object = open('thefile.txt', 'w')
    ) p6 N/ K* s: Y) a2 T0 I0 {  L' {
  2. file_object.write(all_the_text)/ C$ R/ \3 L7 H' Q7 W( {6 r/ E; p
  3. file_object.close( )
复制代码
0 g* Q$ b0 M7 n( C! z

/ B) C$ t8 F: a" M2 m# @写入多行
! i" M4 ?* t2 h- g7 Q# w, O0 S  Z
  1. file_object.writelines(list_of_text_strings)
复制代码
8 _6 r$ K4 C# w4 }/ L( V  J
8 L; w# s) _, K
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。& X& v& ~- D7 L' A4 _% K! i
6 O4 g" R. H4 V; ?; j! E
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
, A0 H' }7 Z1 B. O( f4 {在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
! G7 \. I& a+ k
  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)
复制代码
5 H9 L$ a* f3 }9 I% g
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
# Z1 g5 h6 l% [8 J6 v4 l7 r3 v; `* [9 R
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
! ?, y( N1 J+ }" `, L) M3 O- Y' ]
  1. file(name[, mode[, buffering]])
复制代码

; y* b* q6 Z9 }% {6 D) K* Sfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
7 \! q# D6 F: ]: |9 Emode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
& y7 Y/ v1 l* F& kbuffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
8 }2 `/ M4 r% Q7 I/ x$ N# o- I! P3 R$ P
file对象有自己的属性和方法。先来看看file的属性。! x5 u( \  M$ A& |1 C- }7 s# ]
- _- c( o; R* W# o
closed #标记文件是否已经关闭,由close()改写
7 k! k! i* @0 t* i# iencoding #文件编码
- q/ E" ]2 [: H+ s) Vmode #打开模式
1 M, N2 u# ~  G! Oname #文件名7 @& ]+ n" N0 R2 E5 N
newlines #文件中用到的换行模式,是一个tuple
7 B- e% @/ i2 ?( a( A8 ksoftspace #boolean型,一般为0,据说用于print
' H, W, g- ^- C* k% I  A( }2 f* S$ e" l
file的读写方法:5 M; x: A$ \/ k8 a. P
# T) Q$ }* e1 g
F.read([size]) #size为读取的长度,以byte为单位
# P: y& W/ I  Q$ g, w2 MF.readline([size])# ^; D4 [/ _- s+ V2 @
#读一行,如果定义了size,有可能返回的只是一行的一部分
; P/ w0 y) u" ]5 |1 {. dF.readlines([size])
. f) ]7 T$ u) O3 x#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
5 X% B+ D+ e+ Q- _5 t0 d" m% GF.write(str)' l' _8 _' \$ V
#把str写到文件中,write()并不会在str后加上一个换行符. L* l- c$ j" ]; b- q9 ^; q9 O
F.writelines(seq)* p+ |, `6 H  j
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。  r3 M- v3 C. y" n9 Y) M

( J& q& Y' X* Q3 `1 o1 O! D' Ufile的其他方法:4 n4 ?0 M+ O4 \3 u
1 `- h5 R2 s6 l8 w6 z. F! ?
F.close()/ \$ [+ _8 N; t3 |
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
( W0 t# i& h2 e9 o: v& y7 FF.flush()9 B4 C- n6 w; P# I
#把缓冲区的内容写入硬盘
6 q0 g0 U; u, S6 l6 a. U5 aF.fileno()8 h/ `) v6 D0 l7 x; i; _
#返回一个长整型的”文件标签“3 M0 b' `, Y; n  ?* v5 u5 Y6 \" w
F.isatty()! m1 ?" ?% k% N- d+ [! W/ A. q
#文件是否是一个终端设备文件(unix系统中的)
+ g. ]$ i3 l  D* kF.tell()1 u9 H/ t/ \8 u1 l
#返回文件操作标记的当前位置,以文件的开头为原点) Z8 q$ U* m) O* l$ R8 i. ]! I7 q
F.next()
; d8 [* l2 P' q2 b- `#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。. Z$ Q% \7 d9 ]: J8 r
F.seek(offset[,whence])
4 \9 a9 R8 [% @* `. o#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。$ y7 p6 V* k+ z: w# L) d* F* p) m
F.truncate([size])
' c* G9 e& N" x% \; {, n#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
! X; M$ O4 X, B/ l* t& n+ c4 h/ V, G, I7 J- i& o
总结
- d! O. r& w+ `% n4 Q8 S7 ]
8 d. K; d/ D' x以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-14 09:50 , Processed in 0.085966 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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