新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 497|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法
. O' u' q5 X- @$ q8 t* Los 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

7 `6 d& ~2 o, u+ O) ^4 K
序号
方法及描述
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()

// 获取当前目录的父目录,以字符串形式显示目录名。
% d" Q  V" `- V6 h: ^; d5 s9 G
! n) N" N* m; W# H8 M! K
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 q/ R$ Q8 |% x& o4 m/ B# H

" V3 v! W! U: x' Gpython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
. u/ L9 W% Y# ]
/ x, i8 t0 t# B- x得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
: `# H( _% D6 ~* P; I
# J! l  ]2 b% Q) G" k% b& {7 z
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

# v% H3 I" {/ W" T; g$ s: P6 B( `# `1 ]. P9 n/ @
函数用来删除一个文件:
  1. os.remove()
复制代码
3 K. g  C5 ?# p& G, w/ r
& E6 r/ @3 h. |/ \* b
删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码

* V+ V0 J2 b7 }- f5 j
. m# j, b9 B7 j2 ~' H3 l检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码
3 e7 b0 C4 P% q  y- o0 t8 g6 A
; r1 X5 O- H- o' {; x/ P/ k- x- j2 S
检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码

- G# N( d6 r; [! l* {3 X9 T% O, e  k
判断是否是绝对路径:
  1. os.path.isabs()
复制代码
$ r# ^7 k# q/ k# P  \: e

& Y1 B: J, R* u3 n1 L) Q. x检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
. ?7 l  f& ]* P+ h

8 L+ Q4 z, L9 P8 N3 ~/ T3 s返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码
0 Q, V& }+ F; Z8 z
eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码
/ F0 M# |7 u! s' y; I' W9 T; C) V( v

3 S/ V  b( v9 q' \9 E* V: |4 G0 D" _  ~$ E分离扩展名:
  1. os.path.splitext()
复制代码

7 E4 N6 p# [  d8 ~& p& W* s( {* l9 ]! @; d1 T4 \/ Y+ X
获取路径名:
  1. os.path.dirname()
复制代码

1 S- c8 T5 C1 \2 C3 L6 o; d% ?/ f  }( \% x
获取文件名:
  1. os.path.basename()
复制代码
$ T7 C# t! ^3 [: l3 U

# V* M: M& \+ K1 U. K) B运行shell命令:
  1. os.system()
复制代码

# J0 D$ V( `" c$ n! B
. I- p4 c5 Y5 A读取和设置环境变量:
  1. os.getenv()
复制代码
  1. os.putenv()
复制代码
' a4 I5 A0 f/ r: H4 Z' J; ~
6 G9 C( e- Z- M
给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'! ^7 w; a/ |- A6 w" T

( @( X  [0 U% @- J6 J# C- c. E% E& M指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
; P" h3 V4 w& @# N
) A3 d* N( U9 d; H重命名:
  1. os.rename(old, new)
复制代码
& S; y4 f% c! Q0 F) g# U+ w5 }# K4 E  ]

: W2 Q8 ]% }9 M# R/ ?  q创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

) Q9 I4 D4 _  [
1 ^6 R2 ]) x& G) V创建单个目录:
  1. os.mkdir(“test”)
复制代码

2 ^" w$ j& A' N  X: B; r/ U9 m- o' P3 C' x$ ?. f
获取文件属性:
  1. os.stat(file)
复制代码
4 {" s6 c7 q8 }6 P

' f2 K. R1 F. b4 T修改文件权限与时间戳:
  1. os.chmod(file)
复制代码
+ b2 @$ {* u; {1 N3 b2 {3 p
. Y- [9 J$ e+ J" k* K# v
终止当前进程:
  1. os.exit()
复制代码

% x2 y% X1 K  p7 ~! o5 m/ C1 h( T8 [" `
获取文件大小:
  1. os.path.getsize(filename)
复制代码

& |% ?" N; |: t1 a1 s! [6 F+ \/ Z% ~8 I% L  S. E: V# D5 W0 F
文件操作:
. d- i6 k# J4 [. c
5 J! u6 o5 h' J! F创建空文件
  1. os.mknod("test.txt")
复制代码

- ~, U/ O* w# p9 M/ C. i8 s8 r直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

) l5 }( Y, ~# e. r' ~2 }6 s5 }, F& a. s
关于open 模式:+ h: \( R! S8 `! `
w     以写方式打开,
) ]8 M1 z+ Q: H$ ^9 V# ^4 \" _a     以追加模式打开 (从 EOF 开始, 必要时创建新文件); N3 P5 T1 P4 G8 m9 x( o/ ]* N/ l4 i2 @
r+     以读写模式打开( s% V0 T, K1 |% q4 V; n% G
w+     以读写模式打开 (参见 w )
% ^9 G* v) A0 R$ r; J1 ta+     以读写模式打开 (参见 a )
0 k) P- B, d" e! rrb     以二进制读模式打开
2 K9 k# J7 s" _% S+ }) d" jwb     以二进制写模式打开 (参见 w )' E. i0 C) g0 V6 p$ Y
ab     以二进制追加模式打开 (参见 a )
% k' a( V4 i" g. K; B" `rb+    以二进制读写模式打开 (参见 r+ )
0 }: k0 L+ u+ q/ Y  xwb+    以二进制读写模式打开 (参见 w+ )
: s# F, L+ V3 T! t, G/ sab+    以二进制读写模式打开 (参见 a+ )
3 S, X- L) W2 m5 K0 D, G
4 S- I; I5 c, T, ?) R" e1 V! G
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
) j- W. T" B8 U/ n" W
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分# I  W5 K+ k: A4 h* W" L

& W  ~3 n- s3 B7 f
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。6 n3 ~; O9 V. j! e! B/ i" g

; {8 t* w9 u( a
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
$ Z6 a/ Z4 i! o* E- u& v$ a
" O: i/ O9 ]* H4 G5 x
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。4 D2 S+ W% V3 t4 _2 U* K3 X7 ]

: K/ k  n  l/ P2 h/ }% b: a
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError7 E% G" ~. t5 Y4 b
- E; B0 Y2 a, N0 o; Z! A
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
: A# i7 p. U+ s
& l8 i+ A8 K- [' w
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
2 g- T. \' B- D
4 F- Y% R+ j  i' r3 n% y* M
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)! `+ Z) y* W+ k8 Y2 M. s8 T

! n$ J8 E# P7 D$ n' q7 j3 f
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点' z+ T" \5 f# G0 F1 B6 @; }- T6 T

+ H0 S8 V) }5 r: ?; u; x" @9 K, l
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
+ U+ m' r' y# x% h$ e- `. o, P/ g4 X, T" t% S
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
% L$ j5 s5 k+ V7 H; u3 w
$ a( d5 z" R  ?: W5 r& {3 r/ ^& T
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。$ P6 {8 w4 u* D, [3 v4 }( n" S

" w$ |# N; `) i目录操作:$ p# ?8 F: p( ~* e+ m9 ?8 ?! M
/ H2 U& t+ t+ ~1 K( G( K( z
  1. os.mkdir("file")
复制代码
                  创建目录
8 Q  _& b2 g: Z, A& f复制文件:
4 I! d& P# q) g9 n2 C, H
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件* ^3 D8 Z  i5 E1 C1 `
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录6 s# K1 j1 L& p6 ~4 ?/ a8 l3 U
复制文件夹:- }6 u- I7 w, V% a
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在
; V& R7 [4 d3 B1 |重命名文件(目录). `( I% N) o) V2 S3 L& }
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令$ B1 @' U+ \9 x( G
移动文件(目录)
" n) n+ W- H6 E+ x
  1. shutil.move("oldpos","newpos")
复制代码
% Y9 \- Q$ H6 {  V  p4 H/ `
删除文件8 m0 ^( S  ~* |
  1. os.remove("file")
复制代码

2 P7 b. G; g1 R; N5 H& e: R9 _删除目录/ r& n! f0 b+ T. C5 _2 W
  1. os.rmdir("dir")
复制代码
   只能删除空目录
( R0 X- S) V% R3 O8 n4 z
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删" ?. C' @" n& m3 \$ D- ^
转换目录
) O+ A! M: m  ]
  1. os.chdir("path")
复制代码
  换路径9 ]: C. h, ?+ s3 {
- t- z/ m) z1 H. y- i' i

1 C+ r! O! L0 T) E& k) iPython读写文件7 Y* y, g) W) H! u: F! o5 ~7 H

! L2 P+ J+ r) r) V2 K0 F1 ^# U1.open% p8 R6 ?. r4 X& G9 @1 i
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
1 w  L4 S1 \" o$ m
; B1 _& d+ X* K* z# G
  1. file_object = open('thefile.txt')+ P, r4 {+ R: I: }. |# R
  2. try:$ Y: C4 D& A3 A$ R) K1 D2 F1 T& c  ^
  3.    all_the_text = file_object.read( )6 a9 a$ M, y$ y  M+ a# z/ e4 h
  4. finally:% u8 B+ G, z/ L) f3 [) N7 e
  5.    file_object.close( )
复制代码

3 _2 O5 i7 Q* a  O: F注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
; h2 B% ]8 ?" J3 [; S( \! j3 u/ Q1 a& ~) |4 q2 T
2.读文件6 u' x; s8 F( k# K  c! g

& f2 S- n! B3 X读文本文件0 c5 `' V/ x" S
  1. input = open('data', 'r')
    ) W9 [# \7 x* U1 B/ `4 L
  2. #第二个参数默认为r
    , X; w" ^/ d9 G: X
  3. input = open('data')
    ; U0 B6 l7 Q" p
  4. 读二进制文件7 O" I4 Z: O  J6 h) j
  5. input = open('data', 'rb')
复制代码
8 ]- d3 a- y, J9 B0 B0 y: T
) k2 }* X( G6 P* D" n( Y: N
读取所有内容
- l( I; k1 s3 E+ {9 a/ G$ ^
  1. file_object = open('thefile.txt')  V" f' X5 E2 z7 g5 V+ g: c4 c' |
  2. try:
    + S5 Z+ A6 ]# |0 L4 [. c8 w, k
  3.    all_the_text = file_object.read( )
    * P1 b9 c, i; N/ M" ?
  4. finally:
    8 w* X, m% |' o
  5.    file_object.close( )
复制代码
, b1 k0 D. J: N( g( E# n
9 l8 Y8 \; d0 Y8 C$ u3 f: H
读固定字节" [% W& P( P( Q; I
  1. file_object = open('abinfile', 'rb')+ D& d) \$ f; S% z0 g' {
  2. try:1 v+ @) y2 B. F
  3.   while True:. x! {3 y# K7 Q& f  `2 a: U
  4.      chunk = file_object.read(100)' d6 c# t; \! D5 G) ?1 x
  5.     if not chunk:
    4 m! S  y, l$ |; P$ X7 t
  6.       break
    % t. T% U& i; x: j, n0 ?; N
  7.      do_something_with(chunk)
    , E# x: T! O: q/ L3 D
  8. finally:+ r) a6 c" P" h3 C6 F! |& J
  9.    file_object.close( )
复制代码

' F( B2 u( F* D
, p. Z* d- R6 z" Y读每行
/ t& c0 m7 I9 j7 i, i
  1. list_of_all_the_lines = file_object.readlines( )
复制代码

1 [5 m1 D1 }6 ?+ u3 f- J7 T+ N# T2 o  \. @* N3 T& ^
如果文件是文本文件,还可以直接遍历文件对象获取每行:: A! n- J, [% Z& g+ H" T% o$ h
  1. for line in file_object:* v% v% m) S# w) R
  2.    process line
复制代码
! A% m  M% b1 z- Y
/ f& K& [3 B$ p& n! @& B% R# L9 y
3.写文件3 C( Q7 x$ l) c7 `9 a( Z( J3 u
* l* }+ j. u* R/ }
写文本文件/ @% M/ ^( v, B
  1. output = open('data', 'w')
复制代码
* I6 }% |. g6 R7 Z: G* e
4 [& i& Y6 e5 d* K5 J( E) i7 z
写二进制文件
6 C$ _- K  W" S! \+ \" _
  1. output = open('data', 'wb')
复制代码
; m# s, Q# j6 W; h5 X
# p: b5 n- ]% H2 M
追加写文件* i" E2 o# H2 F8 G
  1. output = open('data', 'w+')
复制代码
& A1 V3 O+ |; h* q5 J  m

/ a+ U$ K/ O$ N7 C0 L  J) Z+ ^写数据2 R6 b2 X7 \9 a1 H; y
  1. file_object = open('thefile.txt', 'w')
    3 D# b, R2 d8 d( t
  2. file_object.write(all_the_text)
    8 S( s2 [% z4 [- }) S% l
  3. file_object.close( )
复制代码

) Y: f) ]# p0 u5 j2 [# Y% Z4 a: c' I: F8 p# l4 j. q
写入多行* w, }4 T0 U) g$ E; d9 w0 W1 z
  1. file_object.writelines(list_of_text_strings)
复制代码

5 b! U5 v4 h8 V% _; O; V
, I& x* b. c' A& V1 q$ t注意,调用writelines写入多行在性能上会比使用write一次性写入要高。" Z5 ?# Y# ?6 k  j, t
2 `0 ~+ @4 z0 J& R! W: [
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。! b$ o1 e$ _4 B$ L4 v- q% @4 ]
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:3 I5 A3 V9 @+ Y/ W: G* x
  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 t8 g( q; x0 Z4 d每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。% B( \) d6 z' E: _  c% |7 e

5 B6 I& u6 q8 [file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:; x) o1 b; T) Z9 w" i8 b+ m

2 N( ~) o9 _; B# k4 v$ L
  1. file(name[, mode[, buffering]])
复制代码
# b3 p+ A7 |8 _; K, B/ Y
file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。0 @$ Y, }% h8 _* C; g! B
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
& x9 u4 R% ~8 Abuffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
: v! ~* I0 j- L3 I0 r( ~) ^5 v0 d8 }- _
file对象有自己的属性和方法。先来看看file的属性。) r- i* P, t4 [! m3 W
) L& B0 j  i; j; W+ g% k7 ]! s
closed #标记文件是否已经关闭,由close()改写4 L! g5 P8 Q: Q3 o; E
encoding #文件编码
3 S# _$ W! W2 o# Ymode #打开模式
$ `7 n! ~+ a4 N" y0 y2 \. f  s2 A8 Mname #文件名* X2 q; ]8 m# R' N1 _- v4 L
newlines #文件中用到的换行模式,是一个tuple
1 j0 \  `7 j8 Y4 b; Wsoftspace #boolean型,一般为0,据说用于print
. B2 i: ~+ s, E: K% i4 O- L* `! R5 A  |1 N' \+ F3 t
file的读写方法:6 o. Y: i+ |: x4 X1 J% a0 [! U

; _% _; d1 C  C/ g: `F.read([size]) #size为读取的长度,以byte为单位# ^0 e4 e. W, ]' m
F.readline([size])
# n' Y7 Y- |9 q' }/ E) G9 P#读一行,如果定义了size,有可能返回的只是一行的一部分
; U! ?$ s( e! H3 U6 ?F.readlines([size])
  f; Z3 K  F/ Z, Y+ l% ~" p#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。% {8 v" F# E1 C# `  \% q
F.write(str)
0 B# G8 \* U8 X1 A: N( K, L#把str写到文件中,write()并不会在str后加上一个换行符7 Q2 X6 Q! y. K: V
F.writelines(seq)  f* t1 f' ?" c$ P( @  V4 [
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
5 }- D, T3 I) }  r& [3 B! }, l) m: J  U! u
file的其他方法:9 l9 n8 g# K/ b+ S6 }( X3 u

& _# J5 D$ [5 K- Z& t1 i3 KF.close()
4 L, ^5 }& U0 }+ ]( o4 S5 s) Z#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
, I1 I" N4 G5 s& ]; UF.flush()5 j- Q4 P! L/ d+ h& Z4 a/ W
#把缓冲区的内容写入硬盘+ J4 J- z+ w# |/ e
F.fileno(), N* t- v) S1 |% S. i; j8 b
#返回一个长整型的”文件标签“8 u, K, e8 Y% ~; w6 H
F.isatty()
2 C! q' m4 q, Z8 O#文件是否是一个终端设备文件(unix系统中的)/ Q7 ^5 d; @: p: y# j
F.tell()8 K6 W1 v9 ]* c3 D1 z
#返回文件操作标记的当前位置,以文件的开头为原点
' R9 B* B5 {" V( n7 sF.next()
) @' L& ?# _8 B' p#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。* o. L# T- n0 {$ I$ O, g
F.seek(offset[,whence])
" S; `% F- f9 N$ x, _' {$ f9 K) J5 m#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
. S) a) K5 q/ ]* RF.truncate([size])& F9 R" |; r, U4 @% x* Y8 H' A; U
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。  v6 L4 p9 m- Q5 ?9 n4 x5 G. b) A% \
8 W% x" H0 ?- y3 p& L* ?3 x2 t+ i8 l( @
总结. L; c4 {3 f. L) M  H( ?

* L3 s7 |9 f, o# m* w$ b2 K以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2025-9-18 08:17 , Processed in 0.082745 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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