新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 496|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法! U; R7 B' G4 ]& k4 G! t6 U) y9 w, }
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

0 G$ M  Q& Q* [, ~/ j
序号
方法及描述
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()

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

! m) P/ S6 |! p
7 L* o2 J: Q" z+ i) g/ N2 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 K( D" X6 U. C9 G" C$ q' S% A) c) F
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
$ t  q: E# o* N: {2 C# P) p) ~9 @# |: ?# I8 H' V* I
得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
! _$ f6 j: c3 H1 Z9 Z
, p' }; `+ P9 O" m0 W. b# f& S
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

* x. E# A: |1 a) y
4 n8 r0 @# @* N  [3 l9 C函数用来删除一个文件:
  1. os.remove()
复制代码
, S9 `- }$ E( ~9 }

# O* m/ |' p4 @/ @! J& v: p: p删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码
+ @, ?8 e; \* A( M/ ^7 \% ]
3 E7 }* A1 e# l0 Z/ i
检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
1 M9 T6 f9 p1 h4 j/ T' z

5 x( v, i4 V9 H5 K' z) T) ?' z- T( U检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码

, K( f& ?" S- [: ^, d8 h8 E- k: G4 r2 X2 h, ?7 w
判断是否是绝对路径:
  1. os.path.isabs()
复制代码

, x" g5 E, l! [- e1 `
. d2 U$ k% `/ e. ^7 |4 s% l检验给出的路径是否真地存:
  1. os.path.exists()
复制代码

2 `4 V( G) E* U9 d; B8 U# ]2 H! b& Q) L: e% a, t) L4 n) L# x
返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码
+ j3 D& z9 m! P5 i' E% }. a
eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码
) B$ M4 g: J/ g' F. a5 n3 o
3 ]0 O( x) q1 C$ Z* }8 g  t. S0 l
分离扩展名:
  1. os.path.splitext()
复制代码

& ]4 |) B+ E2 T0 n+ _) D' q2 |- P$ o$ t- g  k6 `
获取路径名:
  1. os.path.dirname()
复制代码
7 L- B2 K+ k: V1 W5 K

" k4 J& ~9 c* E6 d% J) h获取文件名:
  1. os.path.basename()
复制代码

9 N% T5 w1 W6 J$ h% u5 `$ K+ f& |- _6 E9 |5 P( i
运行shell命令:
  1. os.system()
复制代码

0 ~  a3 K# R7 F7 _  }8 s$ m$ o* @6 f
读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码
. p$ ]( B0 l( }  X- v
6 }7 f6 E; ?: m3 H3 Y- i
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'; r4 K" Y8 u  L) ~9 G
- D' B: s3 b+ w7 X# f0 d3 m& X, z
指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'5 B! D. j7 |2 D. V

) R* v1 y( r5 I4 N$ _) B1 y: ]重命名:
  1. os.rename(old, new)
复制代码
$ N3 V; ^' N8 W3 R( w. X- P; s1 y

/ y# {  M( k: P2 r8 r创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

1 Y3 ?1 O, z4 y4 m3 n' K1 y& m% E8 s& _" M* M
创建单个目录:
  1. os.mkdir(“test”)
复制代码
5 [/ I0 E  }! T; |3 G

6 {. {/ |1 E# M: q0 f& M6 A" i获取文件属性:
  1. os.stat(file)
复制代码
9 S! `/ q1 ?3 x; U! f
+ a( d' f( q9 V# H+ l* V: g* \
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

, S( g3 Z% o, _6 n3 z
! [& C% u. g  Z终止当前进程:
  1. os.exit()
复制代码

! k6 @/ J! r% W" H+ {, Z$ _4 \0 v
+ r" B' O  b- A, t, b$ q7 a3 X获取文件大小:
  1. os.path.getsize(filename)
复制代码
- j% _' \( g4 G. \" c
+ Z# d+ g0 t" o% c/ t
文件操作:9 M4 `! Q0 I8 Q3 R/ p$ J4 T
3 l: p' n# U) W  S1 M  k
创建空文件
  1. os.mknod("test.txt")
复制代码
) i' A1 X" ]+ C' ^, u
直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码
$ s0 A. T8 k; F8 ~8 a+ i. T' ?

. ]) n' ^) s1 R' T9 u关于open 模式:: L2 q8 ]3 B/ x& B0 R1 ?' n3 t; b4 j
w     以写方式打开,
  x, O# i  t6 qa     以追加模式打开 (从 EOF 开始, 必要时创建新文件)
' \# s: W0 X, E& O5 Jr+     以读写模式打开/ Y: V  P8 t& _9 P
w+     以读写模式打开 (参见 w )& x$ ^1 R& r4 H1 q! \7 z
a+     以读写模式打开 (参见 a )
1 n! M- y* I  I3 F6 G5 J" \rb     以二进制读模式打开
- P% I  V$ Q1 u- t. T% Y: X/ Twb     以二进制写模式打开 (参见 w )8 K: c: D) Y" ]
ab     以二进制追加模式打开 (参见 a )
6 p) z  K  |1 Jrb+    以二进制读写模式打开 (参见 r+ )" t( x4 {, Q! b( K6 ]
wb+    以二进制读写模式打开 (参见 w+ )$ s  ]$ K1 h# d9 \( S; |$ n+ s
ab+    以二进制读写模式打开 (参见 a+ )
. K, I" E1 t. t1 D+ N1 d# e& ]3 {; v5 G, L/ F" H0 F5 K
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
$ x% j& x3 f7 c! R
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分1 f5 {8 h: ]* V6 C5 h+ h. v
, _2 K1 y$ r' R3 z7 d8 ?' D0 F
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
  |1 ^" D0 r# y( X; v3 ]4 I% f7 ^4 x& L
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符# c& N" C6 V, n& P& r

: ~4 {. D+ i* f2 o( b# F6 d
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
' ^# K) S, |6 W$ H/ ^+ L$ |+ \
' p8 |. w2 P- _  M/ {$ {3 Z% _
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
  _  D: M0 E; z- V, w$ D* v" O# ?3 r' h3 \! a8 \+ I
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
# C, N/ J& T" g 6 S# Q, e- Y& R) P4 {
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
$ g9 ~5 r3 r# P# H3 R3 v) G
+ P9 |) r, \1 r7 N
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
  c$ f5 y5 B' f) P7 L; R6 S$ N  u6 Z8 {: i4 L+ {0 \* q4 X
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
2 V1 W0 i6 Z" A1 @8 ~3 }4 C" `7 [; t
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。$ I* ]4 j+ f& `7 t- \6 |) l

9 T9 S0 m" R) P5 _7 a4 l, a6 m3 o
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。( M/ f4 ?1 w1 P& l0 j
# S+ b6 s1 [+ Z- d. ^5 B: P6 f
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。# Z$ G$ a% k3 {! c0 P& r/ C
7 Y  }3 G& k5 L
目录操作:# f. S0 y+ V3 n8 j

' i7 `' M' ]3 m* j! \( E- w& A, P
  1. os.mkdir("file")
复制代码
                  创建目录
$ }. @' t2 P  a复制文件:7 k/ k8 O5 \; g
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件
0 S. ?6 w& [  Y+ k) s% \% U# s
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录8 b* G3 o! o9 ~1 X) b5 j. X
复制文件夹:5 M' X6 v1 S7 p: v, }0 P" Y4 ?. O
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
2 d- B5 K+ z. h2 A! E1 b% y+ k: ?重命名文件(目录)
  c+ w$ Q) m/ O" C' _
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令* T/ E6 k( T1 ]5 x1 Y/ N
移动文件(目录); J; B9 I+ L& x3 H
  1. shutil.move("oldpos","newpos")
复制代码
8 i( `: }$ s, j6 D
删除文件
! y1 q3 d. N0 s* ~) D& h
  1. os.remove("file")
复制代码

; D: @( g8 O1 I) v$ z删除目录
# N. o( c1 L- L% Y
  1. os.rmdir("dir")
复制代码
   只能删除空目录
& Q4 S+ Q- Z/ j1 f
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删- Y% X: S: s  x9 g
转换目录
2 @) [( {1 I% ]
  1. os.chdir("path")
复制代码
  换路径
* q" X5 g8 A4 X2 r+ @. S; b9 d- v% n, [$ I; m* \* Y1 f
# C7 v2 Q& e& j7 F
Python读写文件
! T0 N* U1 A8 U; w; O
' N7 u, Q2 _" T2 B9 \+ ~3 S1.open$ h! o: K0 b0 \4 A+ G
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
4 d8 P4 ?$ f! X& M1 x& |
2 r7 W. k1 O  _: e  t4 x
  1. file_object = open('thefile.txt'): T! I9 K3 Y1 [1 C  K) Q, j
  2. try:
    ( {6 U1 K5 B; O' [
  3.    all_the_text = file_object.read( )
    ' y* t; ?! Z: U0 S3 N
  4. finally:$ A# {: Q/ D4 `
  5.    file_object.close( )
复制代码

6 c- V) A9 p0 N7 f# _注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。; {1 n. F# u0 Y4 j- S: \" S
, P% D# T1 F! [- L
2.读文件
8 i5 T# z6 y" x* T2 y, o( Q& |" w  i% {, X, m8 [) ]8 n# t
读文本文件  ]# ]6 c" @1 N, v
  1. input = open('data', 'r')
    ! p% p/ R  `; T8 ]: s8 F
  2. #第二个参数默认为r  X, o0 A4 U1 s+ Y, @" e( _
  3. input = open('data')
    % @" ^; r+ M7 V9 u; I9 Y
  4. 读二进制文件
    0 I% Y+ Z5 X: G8 O
  5. input = open('data', 'rb')
复制代码
9 N0 K: X6 T4 K% C% b% C

- A6 N7 D* ~) `. d; ]# E读取所有内容5 ?4 g% ]9 s1 |
  1. file_object = open('thefile.txt')) h3 [  r1 e: u) S+ x  O1 U! o: i
  2. try:0 u/ c- t* q1 x& W1 x! i$ ]
  3.    all_the_text = file_object.read( )
    7 w. a) b* }1 o! s: V7 \5 z7 X- {. x
  4. finally:% b. b! N6 k; j: _% B
  5.    file_object.close( )
复制代码

2 _7 Q) s, k1 ?' K4 k( G4 c' m1 W7 j8 ~: k- _3 K% R
读固定字节* ^3 m" o/ T9 v! V! E) F: t! k
  1. file_object = open('abinfile', 'rb')& u5 I# ?# f! Y! ^1 _
  2. try:1 m5 {2 `" U" n( p$ z  K
  3.   while True:
    + Z6 W4 C: z% H2 k  q2 ]" [( ~1 a4 h
  4.      chunk = file_object.read(100)7 {5 n: y7 |9 k" d0 l* S7 V
  5.     if not chunk:
    ( W& C/ b5 B$ D
  6.       break6 H) W7 H) i' i( B
  7.      do_something_with(chunk)
      K7 R8 M  Q& I/ p$ a9 s5 f6 }1 X
  8. finally:
    + k5 D+ {: A; T; |+ }( \' c+ P
  9.    file_object.close( )
复制代码

% v2 A  D3 C) |
3 B: N) X  f, C7 N读每行
" P, _! {  L) V* C% R
  1. list_of_all_the_lines = file_object.readlines( )
复制代码

0 X* @  {3 D2 o# L
8 p) k& D' R- |. |. }7 K如果文件是文本文件,还可以直接遍历文件对象获取每行:
" R: ^- r8 |0 J" f1 R
  1. for line in file_object:
    & g5 l8 ?4 M  `( t: [7 ~) X' N) w
  2.    process line
复制代码

' d; S9 A) g7 u# m' r7 F6 W; h. A) K# i
3.写文件0 e! z4 _$ o1 C5 N- z2 B

3 C# P) b* L2 _2 G; X- p写文本文件( \' _3 N! I1 K0 l  p" P8 a( N/ {3 P
  1. output = open('data', 'w')
复制代码

3 N) @) _+ l) |8 v- i
2 a/ h+ v  D8 ~* t* e6 z" d写二进制文件- {4 K' R+ p% w( |" ?  b
  1. output = open('data', 'wb')
复制代码

- J6 l! N" F# P$ l( X( {4 ^) c/ C6 y, k: e2 I% N
追加写文件& k% h& @3 e  Z+ Z1 N
  1. output = open('data', 'w+')
复制代码

2 g$ ]. B# v  T1 [: i& O0 ]$ G: [. t- l6 }; i# Z
写数据
' b8 C6 o) ?# {1 J. `- \* R
  1. file_object = open('thefile.txt', 'w')7 L/ W: J* ~& z2 v# B7 q: [( i1 s7 T
  2. file_object.write(all_the_text)
    5 f' z" S6 w( O3 `
  3. file_object.close( )
复制代码
; {% o& O, J# Z5 h$ ~3 w1 G
4 J& @: s# R6 |- [
写入多行
) ~# G2 ~8 ]9 e  @7 _
  1. file_object.writelines(list_of_text_strings)
复制代码
% Q0 r1 d+ [! Q% [& d

& {) J5 u' S9 a7 C/ x, O6 I# Y注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
! A" D) _4 s/ Y" ~& j6 M  ^, ^0 N; I! g9 M$ X. e" ~
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
0 w* z' p: q6 P( R4 c在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
/ F' ~+ T! F! Q1 n3 A1 J* L
  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)
复制代码
2 G2 x. c8 @+ D* ^
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
8 W' g* I2 ?' ?/ L- H6 g4 |  R6 I/ ]) d
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
: C) }9 U" @0 G# }' o# O3 y
1 R* k/ X6 U" r
  1. file(name[, mode[, buffering]])
复制代码

! s$ N, t4 F2 y& \# |6 Vfile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
: s3 M  k5 N' c, ^: K0 z2 Imode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
7 T) m. y# o$ d; n+ ?buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
  \" Y; S+ {1 A6 z& U7 K
+ |. D: W7 ^+ s& v5 x$ ?file对象有自己的属性和方法。先来看看file的属性。3 y' z( i2 Y8 d6 a! V9 U
& @8 X, C8 `( I7 c2 \; o
closed #标记文件是否已经关闭,由close()改写
9 E5 `- w0 |, p) u7 r* ]8 mencoding #文件编码: a9 n6 j! w  M+ g# s( c- v
mode #打开模式, E  I3 X/ O+ ^) h
name #文件名! z4 v) ^8 u- ^" T9 r; O
newlines #文件中用到的换行模式,是一个tuple
) u" [% J$ _4 \: ?9 Asoftspace #boolean型,一般为0,据说用于print4 ^7 r. A! Q* ]: {5 g% {% n" \
/ }6 K* S: \; F1 D! A
file的读写方法:
6 k8 Y+ _. Z/ n/ R, T4 a3 `
7 W- `3 h( Y; l. R( P# {F.read([size]) #size为读取的长度,以byte为单位
  _) F2 Z; r* v0 X3 ^* v# NF.readline([size])7 `2 U5 o" y% N/ \
#读一行,如果定义了size,有可能返回的只是一行的一部分
* L2 m" ]4 Y; f0 u& c$ ^* J( C6 T+ wF.readlines([size])
2 m. P. |9 A+ E) ~, a#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。/ r' y  Z6 l* Z2 [2 b
F.write(str)  N' `" ^  ^) B( u' y  c- t
#把str写到文件中,write()并不会在str后加上一个换行符/ L' U! Z/ y3 P: j: u# F; e
F.writelines(seq): Q( e1 T% m5 w& \
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。- y6 G* f8 L% F0 t* m1 {

- D) Q( U  K! y9 |+ Ofile的其他方法:$ O3 k* B' b% y
1 t) M# x; S  {7 r( G( E
F.close()2 B5 ~6 x& F* w9 x0 J
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
- C9 G7 B2 J$ Y: v8 M) ~F.flush()
0 j) m% F5 @; a$ ~9 t! m6 d#把缓冲区的内容写入硬盘7 C+ `+ o) g2 R# E% c
F.fileno()
9 _" m4 p6 K, S! m5 F#返回一个长整型的”文件标签“
4 J5 t  A/ v! {7 u2 WF.isatty()! L$ X3 {# W* R, P5 N! _4 K
#文件是否是一个终端设备文件(unix系统中的)
% K6 M; q6 ?' d2 u% G4 _4 T7 \F.tell()
0 F3 g" U/ `# F* a2 O1 V1 S#返回文件操作标记的当前位置,以文件的开头为原点3 N8 w0 f3 M% d" ^- y- I4 G3 }( o% l
F.next()" C: L" L0 s: S
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
& E' K) `0 s8 e1 T# K8 h- QF.seek(offset[,whence])0 G8 i9 X5 k% @( |- o  k( d2 F
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。6 Y( a1 B, x# o) G: ^! H8 d
F.truncate([size]), |% f5 p* A$ j, ?# C; G+ [
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。1 h% y8 d4 M7 `
) N. ^* w" U: b! y
总结
( o; x1 Q5 U6 _1 S6 [7 Z% x( c& M5 J5 j% ?
以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2025-9-18 06:31 , Processed in 0.084464 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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