新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 545|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法% d- D! Q9 c) F. J6 Y" q
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
$ s0 \. [$ J3 e$ w; g2 ~
序号
方法及描述
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()

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

" U9 C' X1 h0 M" O: F' B  K: a$ ~1 V% l0 F0 B- m- c
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读写、创建文件、文件夹等等
2 e; d* i; R; S- B/ _$ |# [) ]+ s+ \9 H
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。) j& B( q' V4 U8 k1 o9 w0 ]
( q! H# B; K  m2 N0 R7 L
得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码

  p4 a$ o4 l! P# U  j0 Q9 A6 A: Z! m3 t$ T/ n, c) \
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码
: o5 |: |# d% t! J, I
  o& g% l+ C: u6 D
函数用来删除一个文件:
  1. os.remove()
复制代码
$ K! e; R  w) G# s* f+ `7 i

5 r7 ~" f' b: t* x删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

  y. f9 m5 K) D! C# u
2 s+ }0 u6 ]; U$ Y3 @检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
9 J, i; Q& j+ C0 D; F9 p

" D4 c1 |( @. N1 f检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码
, c0 Q, F( D5 F- Q
/ X! L& E. v9 X# }  Q# m! F: y
判断是否是绝对路径:
  1. os.path.isabs()
复制代码

; G1 m4 E  W% f  D. c2 ^) m# g  K' H/ \0 }4 q7 ]
检验给出的路径是否真地存:
  1. os.path.exists()
复制代码

( |* X; W1 Y; M6 O( r& D, Q* G
* c" {5 K5 P3 \返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码

& a& X( p! \4 H) [eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码

7 a2 k7 k4 I! x4 ]
: X* k7 Q& q9 g1 o/ R( D4 _分离扩展名:
  1. os.path.splitext()
复制代码
6 q/ M2 B- d5 G, o3 X
# O8 W, U9 a: X; w
获取路径名:
  1. os.path.dirname()
复制代码

8 |6 @* H% b6 I# o4 D) u. {8 P$ S9 `2 n9 q8 t% z8 g
获取文件名:
  1. os.path.basename()
复制代码

8 Z6 S2 P5 Q/ T+ ], L' v" q) \& f* q& J' u% W4 Z& G
运行shell命令:
  1. os.system()
复制代码

) J+ G4 t$ a( t0 y* h' ~1 }3 w0 C0 U2 t9 \8 b2 Z5 L
读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码

7 Y! z$ a" E. F2 u! X3 \* L7 m6 A+ j9 x: D! g
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
0 A' E; P9 n! o! R  F& }  C
8 n' \9 \# S' H( z' N( B指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'" k- _. x& T' b+ Z! X; \. B

+ Q' o- m% I3 r- Z7 R重命名:
  1. os.rename(old, new)
复制代码

: m# c3 A8 J# G: z- r& s) b2 i1 U$ y, a( s9 R4 {: r2 v; r0 @7 F) N
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码
6 c1 N/ I& }* h9 X1 b
7 u0 N, H4 \) p, J+ q7 X. F
创建单个目录:
  1. os.mkdir(“test”)
复制代码
$ E! f/ R1 _. _0 @& [+ B
) ?& r# H( o7 u" O- y% X
获取文件属性:
  1. os.stat(file)
复制代码

: g4 s6 R6 G; B  x  D, @2 M/ r
+ J! w! K$ q' C, o, T, @) }9 Z4 j修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

7 k! y- u" E4 n8 f
4 ?' S5 [9 H, x! h7 c$ P3 {0 g终止当前进程:
  1. os.exit()
复制代码
/ }! q5 C( D' Z
. |' G/ U6 f# m  P* U, y7 @
获取文件大小:
  1. os.path.getsize(filename)
复制代码

5 u6 F/ ]2 E7 [- j- R3 o' f4 p
) @/ W( Z" l- V0 w5 y9 V! Q' p0 Z文件操作:4 e5 Y& u) M- A5 U4 {# ]/ N4 |' g' C: `
, z$ I7 a& |1 B; l6 ^; p
创建空文件
  1. os.mknod("test.txt")
复制代码
6 Z) T3 ]2 W! ]2 c/ ?: w6 Z
直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码
1 E+ K2 m& L7 r# ~4 L* i; w9 w6 w
! u+ n0 ^2 |- f& C3 ~9 }
关于open 模式:6 j3 ?/ l' `% y6 X9 H
w     以写方式打开,7 S8 a; t0 |6 j2 [3 Y3 o
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)1 A6 _! o+ g0 F. n6 p( J
r+     以读写模式打开' e; d: e5 N7 v) N
w+     以读写模式打开 (参见 w )
* y6 T+ u' L( c- S8 L8 Xa+     以读写模式打开 (参见 a )' s$ v  h* i5 w7 Z0 x) B( y0 e; ]
rb     以二进制读模式打开
& L2 D# m; D$ I* O: Xwb     以二进制写模式打开 (参见 w )
) B; P" v& t8 H" c; Z& P0 [" ^ab     以二进制追加模式打开 (参见 a )8 A5 {2 \/ Z( L7 L# s# @8 j' D
rb+    以二进制读写模式打开 (参见 r+ )1 N2 D- f+ D3 X6 o
wb+    以二进制读写模式打开 (参见 w+ )5 f& ]+ l$ f; o6 C/ i2 E
ab+    以二进制读写模式打开 (参见 a+ )) w$ C7 `" U9 c- n& A) L& U

/ x- x# q. |% ?5 f7 p) L
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位) R+ @; S; s# I, k, }' }% Q
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分% p/ f8 {2 Y: r( z

. J5 o' r, n! J5 K3 c! m4 i
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。: T: j$ v2 |5 ]
$ I- f# B- O/ \9 Y# a
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
5 i" b( N3 k4 T+ |
: E% g0 D7 Y, C3 n/ F! r
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。3 H- l; u# `1 f. B

7 ~9 o4 s% R& ~
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
& V7 l* [! P: l4 x  y. Y+ o! D3 c
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
- c2 O2 i& B% B# i- r" n2 n 7 X9 j6 @) V+ [
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“* B+ X! w% F9 ?8 B2 i
6 j8 ]' Z# s0 E
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)& o- F; ]0 h/ A5 {) \* J

$ ~4 m) o" N2 y
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
/ g# E0 ?3 G! h* P6 d
0 r# }0 F; B- o$ o+ a3 g6 J* |( }
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
+ B" i& `9 P" }6 x1 S  \
4 v; S1 H7 c& Z2 Y3 j: V
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
  z% i  |. h; |+ |. V  }7 t5 {# B/ S, W+ o& d" ?0 P
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。& m1 r* b* W5 A

( |4 G: T0 r- S" z8 ~$ I# \目录操作:
  |+ _) ^" R, U9 p% P1 F/ D/ R( |- l$ _9 `/ J* b5 F$ l
  1. os.mkdir("file")
复制代码
                  创建目录
0 K6 h4 h! w+ c1 n复制文件:* H# L6 z9 E( x" Y  d
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件% ]2 w# p4 Z  v
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
( p( u) o3 R7 w9 K8 X( D, L8 q复制文件夹:! F( l9 l2 s! t! g6 W" j. T
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
. s. l. \  R  X- T9 j; H2 t重命名文件(目录)
9 O8 D; t$ R2 a
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令
/ a6 P3 `( `- C/ E0 o* J移动文件(目录)( _1 y" b2 A7 c6 ^" v+ j" g
  1. shutil.move("oldpos","newpos")
复制代码

1 H: w) j" C" Q0 {: E删除文件" [- h/ p; A" i1 O8 [9 z& w
  1. os.remove("file")
复制代码

6 c+ m6 K3 Y( I9 r8 _删除目录
* c/ u6 Q  n9 N' D7 Y
  1. os.rmdir("dir")
复制代码
   只能删除空目录
5 ~: V- o1 _' p, h
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
. g, s: G+ y$ I. }转换目录
8 }6 \- G% z2 I2 K* m( x
  1. os.chdir("path")
复制代码
  换路径5 t$ }7 F! x8 w" j3 u1 l- Q2 B3 h& d

0 F6 D/ w. {6 m
& M  u/ O, ?% g, kPython读写文件4 w4 a8 M4 e8 G& Y. b6 X

. u+ y% n# \  c/ A2 j' L# T# F1.open
- I( @8 r1 w+ s0 Q5 O% N8 T使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
# r0 x9 A- d' V3 y" [, M6 D1 P& n8 n8 U; l( S; I
  1. file_object = open('thefile.txt')
    3 |' @' b' C/ e5 S/ W
  2. try:: x& h2 ?+ L0 f: D% V5 A' Y
  3.    all_the_text = file_object.read( )
    9 Y6 k! F& K9 A3 \' d
  4. finally:3 Y5 S% _% S% v6 m1 Y9 t- @
  5.    file_object.close( )
复制代码
4 w  y% v. H7 n- O
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。/ T2 j! C! a/ m! ^( p# _
7 t$ n2 x. o4 b  V+ q
2.读文件
: x8 Z& x! w* B3 E  f5 }0 f
! a! n5 s' X: l' m& e' H# f读文本文件: R) R3 H6 E% s( o4 @6 L
  1. input = open('data', 'r')6 x' `/ }3 S! o) O" d$ ]
  2. #第二个参数默认为r
    1 ^7 |4 A  {& \3 c1 P) R9 q; U
  3. input = open('data')5 s$ V( L) e" I/ h# Z/ h
  4. 读二进制文件5 ?1 W1 V" a8 O+ V2 |2 a/ i
  5. input = open('data', 'rb')
复制代码

1 M! T  a5 ~  t" p1 Y6 c! {
( N; _- ^: j! M  l- e. @; u读取所有内容' w, a8 H: D, v
  1. file_object = open('thefile.txt')( E1 l# P2 y8 k* Q7 i
  2. try:1 f$ x' ?4 G9 E# D$ J# T+ E# B* ~, f
  3.    all_the_text = file_object.read( )
    ( h* I. i9 e1 u, a7 Q! B! u
  4. finally:
    8 l" o: F1 z/ W& ]3 U& T
  5.    file_object.close( )
复制代码

) _* E2 P# j. b; N# N
/ _0 C( q, [+ E8 i( b2 T0 t( H$ `读固定字节) V' e0 N* a/ ^3 P
  1. file_object = open('abinfile', 'rb')
    ) P  o; T3 b/ D! N" C+ ^
  2. try:
    / B3 S9 w; h( b
  3.   while True:
    & `0 p1 H$ ~) U  p
  4.      chunk = file_object.read(100)8 r$ ~9 F7 g# b: l" B" e, T4 D
  5.     if not chunk:8 \. B# Y3 `7 N; ~
  6.       break
    , }8 ?8 Y0 ]! ]5 D( @" u
  7.      do_something_with(chunk)8 J7 ]( \. k5 b) O# n, m
  8. finally:
    ' ?, u8 u0 O) H$ N& U8 ~% u
  9.    file_object.close( )
复制代码

6 r6 S' D0 {) m9 K- L4 E8 Y3 G7 W  k4 G; D& H
读每行
! f& J9 v5 |2 E3 z  d# [5 u
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
3 h, ?  C- B1 ]% D
" n- q" ]: R- r; k5 Y- Y6 R
如果文件是文本文件,还可以直接遍历文件对象获取每行:
2 K  _6 g4 ?8 V3 a- @9 c
  1. for line in file_object:" G+ \6 p: C$ [8 W! e2 z+ u
  2.    process line
复制代码
, f0 u$ ]9 ?- L: m6 e
% g1 u; Y3 S- I) r# m9 t" r" ]6 ]
3.写文件/ M, S. q: o! K$ w) ]# _2 U4 Y

; |7 s7 s5 d" K$ n$ c1 F- \写文本文件; V, }  u9 i% v5 S" H) I: a4 `
  1. output = open('data', 'w')
复制代码
# _% @, _* }: G' a) ]$ s) j
& \3 z+ T% W8 x/ X
写二进制文件
/ T0 f8 K3 H9 \1 W/ F3 m' P
  1. output = open('data', 'wb')
复制代码
: {0 V; @3 a1 [+ H. q

; d/ Y/ e7 X0 x2 ]追加写文件
: x* G8 D+ Z3 n! r3 R! o5 j' U
  1. output = open('data', 'w+')
复制代码

: M8 S- R& r& r: x
2 s" B7 d4 r  c! \. V' |写数据6 g0 T3 m/ e2 k# m% j
  1. file_object = open('thefile.txt', 'w')
    9 ~5 j8 D. Q0 Q2 L0 \# V2 B
  2. file_object.write(all_the_text)
    6 b( p5 R' ^6 }7 `
  3. file_object.close( )
复制代码
: }5 q4 O" g! e7 N4 H& {! ~
0 a! t" K, `" l. s5 M
写入多行5 \5 B' n! m: e6 I4 L) |3 }+ P
  1. file_object.writelines(list_of_text_strings)
复制代码
% I: \8 o( i+ n. f9 _
/ `& k9 o+ k, }$ {
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
8 ?2 ?# y$ J* a: o6 g
+ t$ o) P& C9 `" U% W在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
1 P4 K# B! x) z- O$ \  _在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
- v2 v. v* O& X( d4 P
  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)
复制代码
$ s: _* g5 _$ y  c
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。- a- J; m- |7 c" ?
$ @' }/ C5 J' j
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
9 s: |% b( a1 I2 [. h$ g* d5 M* E6 z9 u& M
  1. file(name[, mode[, buffering]])
复制代码

/ p9 q1 ~$ |$ Q/ Z  d) f/ Gfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。7 I9 O) P. @& T0 O6 L
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。9 O8 A" J0 W5 ]9 g
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。/ t1 G) a% @0 Q3 L; p& n
, @% J. z/ |0 H
file对象有自己的属性和方法。先来看看file的属性。# E+ l+ G$ O) w8 l+ i
3 V" Q$ i$ |* E  H! w: D+ j
closed #标记文件是否已经关闭,由close()改写
8 N4 B( e+ I) z5 B! @encoding #文件编码
/ P3 {) W& l( X* r% ~' k9 \mode #打开模式1 Y) U8 N- ?3 A5 y
name #文件名
9 i4 U8 p# X( ?& j9 Gnewlines #文件中用到的换行模式,是一个tuple
$ y4 O: d' o1 Y5 t; |. ksoftspace #boolean型,一般为0,据说用于print
3 h4 C6 u3 k4 o9 u1 G" c  B4 y+ a" J- E
file的读写方法:( S# |* o; P. k2 @6 }
8 C  T  s/ c0 j8 t& ]5 Z
F.read([size]) #size为读取的长度,以byte为单位" e. h( s2 P1 Y+ y* [0 r
F.readline([size])
4 S, L1 `5 B1 U; Y% n; p: N#读一行,如果定义了size,有可能返回的只是一行的一部分) q' A3 E) l: T/ W1 L
F.readlines([size])' ^+ X/ g4 Y- `8 t2 _2 {: j
#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
. c/ u$ y0 m7 u- O% _/ D% cF.write(str)
$ P1 g; n8 P$ e! \  z#把str写到文件中,write()并不会在str后加上一个换行符
+ v1 a/ g* c% S* ZF.writelines(seq)" a2 S& Q4 Q5 X5 T9 j( Q6 K. b
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。9 \1 f0 r, f" L- @, b

7 k" Q* W$ Q: |) d  T! B, Dfile的其他方法:7 s" ?# r9 x$ B  H! W' D7 L

7 r( N# e9 J9 u* n: E% KF.close()2 j% u4 v: L( j6 T+ ?, {* n
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError9 d1 [  J# a# p* c1 m
F.flush()2 I8 A: N+ B5 L* H
#把缓冲区的内容写入硬盘
$ n+ @! n5 \% D- L/ R# v5 Q* mF.fileno()
2 y9 Y" [1 z7 {4 o. T7 T#返回一个长整型的”文件标签“
) A/ M' G; L2 t; Q+ V+ @F.isatty()! c2 X4 z' i; o9 Y
#文件是否是一个终端设备文件(unix系统中的). Y. m" ^8 E( P- l# H) j2 |
F.tell()+ e4 X* W, v+ Y# H+ D- c  N
#返回文件操作标记的当前位置,以文件的开头为原点7 Z4 I; _9 Q) `& b
F.next()
6 o. i3 D8 H3 D% H: W#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
# `- L( v' z1 q" k. L/ fF.seek(offset[,whence])
2 f4 z  \. ^% d8 ]9 Y4 ]#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。3 h' z0 r3 l- y4 `8 n) ?/ ]
F.truncate([size])
% c/ B- _/ x, b$ G; y0 T  E#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
! }; M9 S2 @/ F: }% G2 c) L6 V. L( p3 y9 c+ v
总结! y) Z- t/ v! T  E
2 o! M7 f3 J# j3 \
以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-11 15:38 , Processed in 0.093460 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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