新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 546|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法
$ W$ X/ h, S& ^7 @: _# Q, los 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

7 g, a& d, ]6 f1 ^1 b/ R& ~& 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()

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

) Z0 I" W2 O5 `7 Y5 Q: l
5 O2 X3 G6 N' e- o# g6 p# x
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读写、创建文件、文件夹等等9 z: `. r: @- r4 ?! g) N$ h

( M$ K9 E, F8 ?2 s5 ~& ppython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
) l+ T2 p7 n7 X) O' [" F/ ?7 J2 ]: z' z! w4 R. P6 ^5 ]6 Z
得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
" J0 y# ?& `' }+ C! s% N2 h5 T
+ l+ P' E' c+ r: Z+ O1 S
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

# }" R6 Q1 \6 {% ]/ A. G2 [: I. R4 f
函数用来删除一个文件:
  1. os.remove()
复制代码

$ k) Q9 R* d0 T: }0 h
3 p; T- l+ j0 z7 [  @( ^删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

5 I1 d' S. w8 E' N0 y! v, i
5 v8 l! U+ v4 }' E: [7 A: U检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码

/ X% O7 V: H$ O- d9 ~
3 ]; P1 K3 k* p检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码
6 m" W6 d4 m3 }

) _- ~- o( B' `, w2 b判断是否是绝对路径:
  1. os.path.isabs()
复制代码
' k+ {) k! m6 D6 a4 D' ^

" H( E  d7 S* N6 U6 z( q* L9 i' W检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
( U% t1 J! }7 \( }+ K3 l
, n  m. M( a2 w: Q0 d* H' }
返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码

* }# P- F2 s7 _9 r* D8 feg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码
! ^6 [7 H0 w- W% k3 v, |6 E
8 R8 c& j; p/ [+ I+ L+ U* n; B! a, R
分离扩展名:
  1. os.path.splitext()
复制代码

! x# [9 }% j* G$ \9 t* Y6 k: |2 G2 S8 e7 Z  f
获取路径名:
  1. os.path.dirname()
复制代码
2 H& g9 F: T" ~$ v3 d6 ?

- h0 Q% S. k, h8 F6 b1 o获取文件名:
  1. os.path.basename()
复制代码

- R4 E( \' ?* T+ z8 t4 i- }6 n! t8 d3 n8 R
运行shell命令:
  1. os.system()
复制代码

5 I- W1 ]2 _2 i/ P5 o
# F+ k1 D/ m: @, F( A: e, f$ Q读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码
& a  H& Q8 `$ r% H6 |, Q# f0 a  I
* o# y) H$ z# r; g
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'" i) D; q4 T, K6 x. z

" n1 F9 ]$ {6 F* f) _4 t指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'3 m( h5 A. x/ [' @8 O* S
, v1 J6 q0 ?' q/ O
重命名:
  1. os.rename(old, new)
复制代码

- b0 {; F$ H. z: B% Z; Q5 z% Y" T1 K& H
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

. Q6 j5 R+ B$ k- `% J" Z1 B6 p. K" w' T, b9 Q
创建单个目录:
  1. os.mkdir(“test”)
复制代码
/ O0 b' H) u# D9 N$ q( y; h$ T% z
1 \+ y/ [; e5 e
获取文件属性:
  1. os.stat(file)
复制代码
  ^  `2 J2 v& b: _$ o
1 w8 K& b; C8 }5 r, L9 ~( G1 J* i. q! V
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

$ C: u7 A2 u( g* ]# E7 F3 `
* a* f  Y+ S) v6 O终止当前进程:
  1. os.exit()
复制代码

7 @5 t6 a5 o0 z1 K1 `6 ]+ B" ^- V$ D+ }, H
获取文件大小:
  1. os.path.getsize(filename)
复制代码

0 ^4 w  c/ n: c8 d& s
( t! v# H/ d1 M! M1 `4 w文件操作:1 s6 H) h! u- G/ F% O1 I

) u; j9 p8 |* j创建空文件
  1. os.mknod("test.txt")
复制代码
7 k! P  ^' J6 C. w5 L
直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

( K  G& p9 s5 w" a0 R# R# w1 c7 F# T$ F( b5 d" N
关于open 模式:
  u% v% y" I* B5 ?: Uw     以写方式打开,
. W# p) b" i- o* la     以追加模式打开 (从 EOF 开始, 必要时创建新文件)
/ s% W% [$ t6 {& nr+     以读写模式打开" y; h) y# t5 V
w+     以读写模式打开 (参见 w )
% I5 ~" T$ m+ }$ ^. k2 r% _! G, c% La+     以读写模式打开 (参见 a )
0 ^" ^: g, E" r4 M0 k- O% Z' O& erb     以二进制读模式打开
: ~% B& g% F- C5 Xwb     以二进制写模式打开 (参见 w )
1 g$ ^  i! M5 J, c  ?ab     以二进制追加模式打开 (参见 a )
) z" {' _3 W: Qrb+    以二进制读写模式打开 (参见 r+ ): B7 w* u* q3 \! r
wb+    以二进制读写模式打开 (参见 w+ )& B+ @1 B- `& b4 ^" H7 O
ab+    以二进制读写模式打开 (参见 a+ )' C; p6 {/ k. G# K; |: C

: h4 E; T' l) }$ E8 q
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
6 t4 Y! \# s) P7 |. ^( S
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分
- z3 e, H+ y& M( t% n  Z8 X! c5 c8 e6 D$ S/ [0 K0 l1 V
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
/ g& i* U' {, R0 Z* \
# O0 G, J, G% I% Q2 W
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
1 ]5 E4 b; f9 V! M  m% n- o3 ?
: @( z/ X' P9 ^/ z2 z* x; N# B
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
/ s, J9 Z+ ]7 q9 \
; }8 ^1 L. @; S# n- L
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError% Q4 e+ X; u, G' |$ S5 [
! n9 g3 f# `; f  g- K! ~
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
) W; V9 h9 E% I" T; r 9 a/ U& s: A0 B5 D* j8 R& Y8 H2 u
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
9 u" n# k7 ]' Z3 ?- V" g& G: q( T' m7 J9 a+ g
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)# C% F3 Q5 r. E  @
. r8 q% s: \8 z3 m
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
# J( v4 {# r  t! l' T3 I4 H9 @2 L0 d# z, g% q" f
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
" J- y' h( Y, P. J/ \% q6 e) U2 K/ c2 H( R
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。7 m- U( P' A% X1 C$ }# [
0 ?, c, n0 z- }& L
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
% H: ~' P8 t+ V. z# V, L  T5 t: X( y; |, J
目录操作:$ V: r$ ?: v, v" c- x

5 D3 `) l( o3 f- b, y0 Z, @1 E
  1. os.mkdir("file")
复制代码
                  创建目录
2 |: I! X) j% h( U; L* s' T3 R复制文件:
5 s  Y6 D' R, c! T7 q7 o# F- ~
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件
0 U" ?. V; q! O( V( c
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
9 H. j. T1 {# `1 I复制文件夹:
% A/ D8 f& _5 F* s' W5 {+ o( O
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
1 `2 [2 S3 c2 H/ g1 X4 v重命名文件(目录)- `; F# l3 I' k/ n$ g
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令6 o0 p) S2 |4 j/ n1 E
移动文件(目录)  ?5 \$ S' a9 k$ A. x
  1. shutil.move("oldpos","newpos")
复制代码

) q, w4 u3 h7 m4 [' K5 L删除文件
2 _& J. i. R6 \" t
  1. os.remove("file")
复制代码

+ G- L/ N# N! J& L7 e" _* D删除目录2 Z7 [" Z) x6 p* }# F
  1. os.rmdir("dir")
复制代码
   只能删除空目录
% m$ c! @6 B8 D9 I! P# X/ w* J
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
+ R$ C4 d' O* ~/ U' ~- Q  A5 l转换目录
3 h- a+ q. k/ J! M# m6 v
  1. os.chdir("path")
复制代码
  换路径
' z% V" w. d5 Q( R, N' ?9 Q! Q1 S* g9 y' O' I. [4 }6 y

9 T7 m8 \+ J! e  e2 [& w" PPython读写文件
4 P% s" w5 `- I7 j0 ]) R* |3 @. C$ W) {% M: \# s  B
1.open: Q/ p' ?# D) [6 k3 @; V$ w7 Q/ i
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
# e. t6 }4 s' R, O" D: l$ s; Z, g6 A0 Y/ H2 Y* s8 x$ w
  1. file_object = open('thefile.txt')
    2 `" \4 _; n( o
  2. try:
    ! [. W$ ?; m! l1 Y( Q
  3.    all_the_text = file_object.read( )
    ( R, B; e5 l; ~) T, G) t7 L# G
  4. finally:
    9 y* w7 g1 @. g* o1 E1 \0 v
  5.    file_object.close( )
复制代码
7 s- v* Y" \- j9 b- G8 U" [2 s
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。0 x( m' l, U9 e

# F: L4 y' a- m1 ~, @- c4 y2.读文件
9 h  p! ?. E0 [) \+ O1 q. K; A6 `- q) k6 B# B: T) G
读文本文件
+ @* i' d/ W- c7 j
  1. input = open('data', 'r')
    & a( ^$ W$ a3 w# f! D5 E
  2. #第二个参数默认为r# b9 d: D1 t4 j' R, d" g! e  N3 g
  3. input = open('data')* _6 O9 K: I) S: A( Q( t4 y
  4. 读二进制文件% \4 H, u% u) \; Y7 u
  5. input = open('data', 'rb')
复制代码

3 B0 O. o) G, i# w# U4 R
* C2 W4 ?6 T! O' D8 _# D6 l) R读取所有内容1 U7 }; R  b/ o+ Q5 W5 E( s
  1. file_object = open('thefile.txt')4 t$ Q/ M0 P) ~: w8 \, z
  2. try:
    1 Z* S# ~7 m, Y1 D7 F; t
  3.    all_the_text = file_object.read( )
    ( ~2 o$ m( ^% t- h) N4 X& t
  4. finally:' M$ G8 G8 j6 }. s: J% w
  5.    file_object.close( )
复制代码
! _1 X8 ~1 x! t+ Y$ `2 S  p1 T8 N

6 i# S' Y0 o. |3 D! ]- e! o4 B, ^读固定字节6 u/ B: ^8 C( v/ K
  1. file_object = open('abinfile', 'rb')' g) d) l" ]0 T8 f7 ^$ m; G
  2. try:
    / ?8 g+ A: C! Z3 D. q% L$ B
  3.   while True:
    * G$ q# y1 E! D0 O3 U. w4 q1 r
  4.      chunk = file_object.read(100)
    " K0 Z: x& [! M$ N6 _
  5.     if not chunk:. ^; G- L. N1 o. {" e5 p3 l
  6.       break
    ( H6 p9 D! [: I2 q- d- l
  7.      do_something_with(chunk)
    : F( @6 F+ K' P8 w( v, C
  8. finally:7 u7 e+ e* \/ [& F: q( I
  9.    file_object.close( )
复制代码
. }7 J7 k% P* `" E
/ \- ]$ T9 C" V) x  s
读每行
  ~* j: n9 |0 s$ j+ `
  1. list_of_all_the_lines = file_object.readlines( )
复制代码

' e" S0 A- Y5 U" T# ~/ K# V8 y+ Z7 `; e& x/ ~
如果文件是文本文件,还可以直接遍历文件对象获取每行:2 c! [% q' N' C. Z* k
  1. for line in file_object:, J* p& ~5 x7 T9 o) Z
  2.    process line
复制代码

' P7 W! C% O/ n$ |2 X  y  n0 b. A$ X: S7 L* t' G2 j- M& R
3.写文件
( R; }* K1 a/ r' y
+ b1 s+ Z& J$ D' ~写文本文件
( H1 }+ r0 s! _( H9 O
  1. output = open('data', 'w')
复制代码

+ f7 ~3 K. W9 W+ S2 P! L( {  O- o! f7 s* g9 s: W
写二进制文件
1 b; i1 }: W# E3 _8 |. `
  1. output = open('data', 'wb')
复制代码
; k  W6 e: S( Q3 [0 ?/ t
0 ?" Q; K1 O2 Z! o; n' c/ _4 [
追加写文件0 L6 z+ V9 K9 S( O. F0 u4 D1 W
  1. output = open('data', 'w+')
复制代码
) S$ l- B0 u. t

7 f' B+ I& B/ l+ d2 X' }2 p0 I; Q写数据$ @9 x$ V8 O# J" W- r
  1. file_object = open('thefile.txt', 'w')' M1 {6 W# U% R' b# Z
  2. file_object.write(all_the_text)7 l3 h, h3 S% k# h% ?7 u! K
  3. file_object.close( )
复制代码
% r8 Z- K/ [& n& }/ w+ t0 [

0 a, A/ G1 U; Z9 U写入多行0 V4 ^1 ~: j$ \4 t5 O
  1. file_object.writelines(list_of_text_strings)
复制代码
: f2 ^) Q6 y2 @+ Q1 d
" G; C, L* ~5 ^: P+ C4 `" C, v6 Y
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
) Y7 v* b. u2 B2 e9 u5 M0 Y4 j8 l4 C6 }# U# G
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。0 y4 i( _. U/ ^* E, e% q
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:
( ^5 q1 y0 U: ~. V
  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)
复制代码
& o! T  K5 g# i6 h+ u
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。# x( X6 _, @$ V

8 c* V; C5 }/ Cfile在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
. h2 {- ]$ }" d9 }
  l: X8 t% E- E; Z% d( ?, L
  1. file(name[, mode[, buffering]])
复制代码
. r& }% l6 J" n+ C8 Q
file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。" i  `2 B. k0 j6 u
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
+ q. F( O& n+ A6 w5 |( B9 C$ Qbuffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
9 E7 I0 h; q1 r4 u2 t
: }$ c5 C9 c( P- x* Hfile对象有自己的属性和方法。先来看看file的属性。
/ P" M- ]& X" r$ ?$ Y5 s8 Q# r- t% o$ j! K; H; H* k
closed #标记文件是否已经关闭,由close()改写, W) @3 K+ P7 F% e. B) |" Q/ C
encoding #文件编码
" W) T) L' u% F+ F) V5 T0 lmode #打开模式- L3 ]' J( }0 ~* k! D  U
name #文件名
( r0 {! d$ n$ inewlines #文件中用到的换行模式,是一个tuple% w4 T5 L; s8 H" f& o
softspace #boolean型,一般为0,据说用于print
) R; y, R& r) S  v' E  A3 S+ N5 J2 m1 J& R8 c) g: {" u, O5 v4 l" D
file的读写方法:7 \6 r9 o$ J; b
. s4 p( v; S8 a% N6 d, a
F.read([size]) #size为读取的长度,以byte为单位
( }+ f, |: \: zF.readline([size])5 c+ z6 g3 m5 v2 f5 d2 O  I* F# p
#读一行,如果定义了size,有可能返回的只是一行的一部分
- `- Y4 C( N5 _- |3 B" p3 sF.readlines([size])
6 o2 z& G4 C! G# {- m7 [: [#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。4 T' r- r) _  i6 r! Y; o/ N! ?
F.write(str)9 d* }0 o' y4 ~/ ~$ [. S5 r  Z
#把str写到文件中,write()并不会在str后加上一个换行符4 G. Y1 g' L8 h: b! {
F.writelines(seq)( o8 v5 |3 m4 K
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。5 B5 u& i' M) k6 }# f

+ Z; _! q* ]$ S' R$ S) `- D1 Vfile的其他方法:
# \- l) S+ o/ ~6 E4 t9 Y4 {5 S' h8 t
F.close()6 [" m; z8 Z0 c3 C% O* ^
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
) A# o( b% E2 h, L" o, C) OF.flush()5 t+ q( T: [* {2 p: k6 u$ t
#把缓冲区的内容写入硬盘
% q& b7 U! w1 D( |1 PF.fileno()
0 q3 P$ A4 O) C' Q#返回一个长整型的”文件标签“7 c1 u7 N$ C( |( m
F.isatty()# z+ t, {5 M/ x, Z4 |0 R
#文件是否是一个终端设备文件(unix系统中的)# m4 l' T2 F& v* J/ p' l# \) T/ W* L
F.tell()
* U4 l; b7 y6 y/ Z+ c#返回文件操作标记的当前位置,以文件的开头为原点
8 P: d/ J2 X& y5 ZF.next()
9 \/ d1 o) b2 A# g9 `" k2 O#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。* u' Z2 I. E* m' ?, e
F.seek(offset[,whence])
) G+ \4 F& G% S8 ^#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。4 Z- v0 \7 b- B) ^
F.truncate([size])( r! {# O( b/ E- W/ L1 b( T
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
# E$ H/ _0 E0 ~* C7 e* U% Q7 F2 Z& C6 L2 Y6 K
总结
9 ~. `& i1 w. Z3 N4 N
; a& i+ ]9 }5 `7 ?6 w! p4 r以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-11 17:25 , Processed in 0.091548 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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