新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 599|回复: 1

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

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

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

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

x
Python3  OS 文件/目录方法/ {) t! V, O) X( {* p6 G
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

+ D! d! x0 H3 b% Y
序号
方法及描述
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()

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

8 r# C8 [3 F- I$ {
0 V% _" A) @/ f" s% L2 u
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读写、创建文件、文件夹等等3 S5 {1 n* y: ]3 j1 S! S! o! q

/ m5 q0 }$ p( p$ L6 U3 k/ H! W7 jpython中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。5 q" L9 ~" d5 Q5 l  F6 S' U' F* C
+ X% m+ K7 C- {$ a, F& }
得到当前工作目录,即当前Python脚本工作的目录路径:
  1. os.getcwd()
复制代码
# Z# @. F. B- x$ X" F/ g
$ u0 z! f# V. Y& d. v: N- |
返回指定目录下的所有文件和目录名:
  1. os.listdir()
复制代码

" u( J% T0 P) a+ o2 O- f9 ^* l. W" D
函数用来删除一个文件:
  1. os.remove()
复制代码

. T' _* Z% Z  a4 t% t
# B0 `. ~+ I% W0 y删除多个目录:
  1. os.removedirs(r“c:\python”)
复制代码
1 Z4 Q, x. }: b" r1 @8 t( l2 N) W
/ |2 F7 f: @; g. p3 b6 [
检验给出的路径是否是一个文件:
  1. os.path.isfile()
复制代码

3 e5 W* ?  O! l8 U3 V. z" y2 ?  m
检验给出的路径是否是一个目录:
  1. os.path.isdir()
复制代码
; c5 l5 A( F6 f
& f; ]; s) s2 E* f% n* p
判断是否是绝对路径:
  1. os.path.isabs()
复制代码
* G: N1 W3 Z: Z4 j% r  \3 F4 P

# M( E1 Y6 O; v# a& t1 {7 i, x检验给出的路径是否真地存:
  1. os.path.exists()
复制代码
6 x( r8 g) j1 H+ u1 Q5 K4 K

% ~$ e4 C7 C- o; A  d返回一个路径的目录名和文件名:
  1. os.path.split()
复制代码
7 n$ d: ]. l7 o- b
eg
  1. os.path.split('/home/swaroop/byte/code/poem.txt')
复制代码
结果:
  1. ('/home/swaroop/byte/code', 'poem.txt')
复制代码
, c6 y4 d2 i+ e" i& O
8 X5 m. t) T$ P7 e% J' \
分离扩展名:
  1. os.path.splitext()
复制代码

# x4 k0 A4 q) @) {9 Q& o( P9 `: ~& m* S0 @
获取路径名:
  1. os.path.dirname()
复制代码
4 ~1 O' O- B% x( R/ }4 L( }" s/ _: z

% `! I3 N1 q+ Y+ U; B: M获取文件名:
  1. os.path.basename()
复制代码
6 F$ F& b: }( c" \. c

6 _, E5 F8 i9 s' J: N9 z% m! }运行shell命令:
  1. os.system()
复制代码
) ?# R4 o+ c2 ~6 p. [* A2 Q  L

9 J, z; g" a+ j6 n- T读取和设置环境变量:
  1. os.getenv()
复制代码
与
  1. os.putenv()
复制代码

8 f6 u1 Q3 W" g5 ~# P
6 ]$ D7 b9 M: ~1 D9 R给出当前平台使用的行终止符:
  1. os.linesep
复制代码
   Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'& o/ C  o7 Q+ ?# ?% D( s
/ I  s& f( r# C
指示你正在使用的平台:
  1. os.name
复制代码
      对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
7 Q6 T$ ~% p% J7 l( v9 E) k0 T! P1 E& x( {
重命名:
  1. os.rename(old, new)
复制代码

  Y" y, `% H8 D+ @" R2 J0 }  G- {) G! w+ R1 R) [9 s
创建多级目录:
  1. os.makedirs(r“c:\python\test”)
复制代码

, S6 [1 I' w5 f2 ~
# n. ?7 i. k4 Q创建单个目录:
  1. os.mkdir(“test”)
复制代码

$ P% O! t- \+ d5 S2 B2 o+ T9 [, E- d1 Y8 m( y* j
获取文件属性:
  1. os.stat(file)
复制代码

7 R0 m  o6 c1 ?! A0 x8 R* G, B7 X5 p  L0 ^; o
修改文件权限与时间戳:
  1. os.chmod(file)
复制代码

, }1 e" o: n, w  Y( c7 |! `$ H: |+ {) X5 K6 U8 r, W
终止当前进程:
  1. os.exit()
复制代码
  u) D! g  \) a& x* O1 J

# _3 A9 E7 l( l% W获取文件大小:
  1. os.path.getsize(filename)
复制代码
6 a* k6 q8 ~$ B8 L# q1 K

5 d" c* Y  w7 \4 V) f: t0 B  |) y文件操作:
) ~0 J2 R" t. J: _
! w9 q! w. e% x4 o创建空文件
  1. os.mknod("test.txt")
复制代码

2 `# W& a* E  R* l7 x直接打开一个文件,如果文件不存在则创建文件
  1. fp = open("test.txt",w)
复制代码

  o6 x5 D7 p& S7 \+ }; X2 @! p4 d9 ^* a
关于open 模式:
9 O: ?4 q0 E2 uw     以写方式打开,
* C3 b# u) _# s' C" R! b0 P1 Ba     以追加模式打开 (从 EOF 开始, 必要时创建新文件)- ^$ M6 |8 ~! A9 ?. H
r+     以读写模式打开
  B( Z& F: X. O6 h! u" @- `w+     以读写模式打开 (参见 w ); a# p( G1 y+ [3 j, Y/ \6 d
a+     以读写模式打开 (参见 a )
; P" F# B) |: y$ O7 l% Crb     以二进制读模式打开3 x5 e( M! }- |  X% M. \
wb     以二进制写模式打开 (参见 w )9 H$ S8 p/ ~1 a  N
ab     以二进制追加模式打开 (参见 a )- n5 m- ?! u5 i$ K- y/ u# y, Z, ]
rb+    以二进制读写模式打开 (参见 r+ )
( t% n4 \! l5 @  Qwb+    以二进制读写模式打开 (参见 w+ )
% f+ d" L+ i2 i5 q3 {: c1 t; e2 M( Jab+    以二进制读写模式打开 (参见 a+ )
8 s* _) ]. q) u2 g' b% d) i" S# m( }8 M% e& g# V* Z8 w- ?$ ]
  1. fp.read([size])
复制代码
                    #size为读取的长度,以byte为单位
* M9 `' D9 v5 b) P) L% U& Y
  1. fp.readline([size])
复制代码
                #读一行,如果定义了size,有可能返回的只是一行的一部分. o+ ~- }) e. q
6 y  ^9 d8 m1 \. m. w; d
  1. fp.readlines([size])
复制代码
               #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
; f6 @! Q* w( t' a( k0 X* r! N2 m* h" U8 R5 ?4 ^( f5 l2 I
  1. fp.write(str)
复制代码
                     #把str写到文件中,write()并不会在str后加上一个换行符
( _) A6 G) `; t/ z8 p# I; `4 y7 T
4 `* g1 N, E& D' _1 [
  1. fp.writelines(seq)
复制代码
           #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。+ x8 B/ Y' U. [4 H, ?

( n! J  O1 F6 j7 |1 Y& [
  1. fp.close()
复制代码
                       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
9 E, P7 P' z$ a0 a1 {; y. }5 m6 E& l( K3 ~7 `8 A0 U6 d
  1. fp.flush()
复制代码
                                     #把缓冲区的内容写入硬盘
& M- W6 H% k  e6 L% E! I* K
- R4 u* w) i$ R/ n. [
  1. fp.fileno()
复制代码
                                     #返回一个长整型的”文件标签“
9 M$ ~$ j1 Z8 D5 a9 S/ g) i  R- Q& Y$ F# u
  1. fp.isatty()
复制代码
                                     #文件是否是一个终端设备文件(unix系统中的)
' U% Z+ K9 p7 B: D7 G9 b+ \
* E* n% I3 a; D( m6 g/ G
  1. fp.tell()
复制代码
                                        #返回文件操作标记的当前位置,以文件的开头为原点
+ Q. _! U% _" v5 v% Y! c. X  o' h" t; U
  1. fp.next()
复制代码
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。+ T4 U" X2 j6 _/ _

0 i8 f: u8 F$ q
  1. fp.seek(offset[,whence])
复制代码
             #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。4 U- S+ h3 x( E9 D' ?

- l8 @3 X- C7 i# F/ ^8 u5 T
  1. fp.truncate([size])
复制代码
                      #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
3 t2 Z! i' e% n( j& V; z5 H8 c
/ G& S8 l9 [# @( q8 s& P$ Q# X目录操作:. n4 a: I- W9 M9 `

( \+ L7 W- `! T8 M& Q
  1. os.mkdir("file")
复制代码
                  创建目录
/ u- [* f5 i" \复制文件:
$ D5 v) ?& q* r2 a0 m( s2 L7 C
  1. shutil.copyfile("oldfile","newfile")
复制代码
      oldfile和newfile都只能是文件
+ \; }5 j  J4 v9 T- h! {  D
  1. shutil.copy("oldfile","newfile")
复制代码
           oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
& j8 D8 c( I( ^  I复制文件夹:
% N# \" I: O5 L. c! |) c# u9 c% Y
  1. shutil.copytree("olddir","newdir")
复制代码
       olddir和newdir都只能是目录,且newdir必须不存在2 d2 N5 R+ Y3 I3 i& `* e; P( P
重命名文件(目录)( B) i/ `6 u- S' @
  1. os.rename("oldname","newname")
复制代码
      文件或目录都是使用这条命令9 n( F2 x& L3 }8 {/ _6 D. q$ e
移动文件(目录)
$ h' M" V, ?2 m% x- y
  1. shutil.move("oldpos","newpos")
复制代码
, c/ A0 ~2 s* ?7 i9 _6 q, g
删除文件
" R5 T0 \) X; T( R7 ?
  1. os.remove("file")
复制代码

/ D! r3 z: S4 r2 i3 }删除目录5 h  H; t) N8 X0 `" b; {" B/ ?
  1. os.rmdir("dir")
复制代码
   只能删除空目录; V. I9 X8 t; ~$ T
  1. shutil.rmtree("dir")
复制代码
   空目录、有内容的目录都可以删
3 R4 m3 ~# s6 }3 c! d8 T转换目录
' E+ I' ?# N1 G6 S" K
  1. os.chdir("path")
复制代码
  换路径
. }' m. n8 y* v! s- e! [! y4 M0 ]8 G% h
& F/ P, z0 e) ]/ y, D8 U+ I% o
Python读写文件! Y' Q/ U8 L2 }6 X3 V
6 ^7 |( ~5 ?- h
1.open4 {  F" I! P7 |/ Q1 _! T7 C
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
$ A. J2 l4 G3 E& ^5 c" w) U4 }
: _4 l/ c- i' M8 k  R/ X: G
  1. file_object = open('thefile.txt')
    ; b! e, ^7 v3 z" J" x
  2. try:4 A& c% A: A: P7 d6 U
  3.    all_the_text = file_object.read( )
    , l) \/ j( q( v9 D" M( V
  4. finally:
    0 b5 p$ m0 S! r( S& ~4 z
  5.    file_object.close( )
复制代码
/ m8 |3 [0 O8 ~1 h2 n
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
+ w$ r5 O& b' M8 r4 x/ `7 g, R5 Q+ `5 v0 Y; G3 e
2.读文件
9 z/ P/ y" k7 J
: N% ]$ r( C1 \1 N4 Y& k  `: d读文本文件; O# @% @( s8 @3 B! s( Q
  1. input = open('data', 'r')
    ( w- x9 p. H- }  d
  2. #第二个参数默认为r
    ) j/ M( w7 u7 P, w+ w' y, p
  3. input = open('data')
    4 c4 C0 W* E% j% T0 j  g
  4. 读二进制文件
    ' P' T% x( @+ G7 L
  5. input = open('data', 'rb')
复制代码

5 M: J" y) f& y; f- \( ^9 F5 \0 y( w( [6 M# N: o4 _" `& k
读取所有内容
, |! T+ E6 w6 o6 e4 v
  1. file_object = open('thefile.txt')5 T; I' W7 M, }
  2. try:0 x0 ?( b* x4 H# V) e
  3.    all_the_text = file_object.read( )" l* S. A* a, N$ f. J2 ]
  4. finally:
    6 R1 E/ G/ A, X
  5.    file_object.close( )
复制代码
: }, m+ @9 E& r6 b/ p/ \
7 V( p1 P+ R  ^
读固定字节6 ^; d$ I; L+ q# `0 A0 k
  1. file_object = open('abinfile', 'rb')7 \0 u! R5 q% x# C& H+ Y
  2. try:
    $ F' e% o1 D" X- V0 H
  3.   while True:
    # x& i& d2 C. J! Z  G, ~
  4.      chunk = file_object.read(100)# S% j+ m( ~$ {" Y% H
  5.     if not chunk:
    8 V/ _4 M  f: {
  6.       break% z: ~2 n' ?7 f- @7 G
  7.      do_something_with(chunk)
    + A2 q6 {' u  y1 c
  8. finally:8 `" K# B5 j. D+ V+ ^
  9.    file_object.close( )
复制代码

0 e2 |: y% y( M3 }
% L9 h/ E+ q0 ^读每行
& t( p- S6 {! N; a$ C
  1. list_of_all_the_lines = file_object.readlines( )
复制代码
& J0 H/ ?! g: Q7 c, k
% T( @1 g; m! ~7 @
如果文件是文本文件,还可以直接遍历文件对象获取每行:5 a6 i' B7 ~/ h* s/ J
  1. for line in file_object:' H  l, R6 U7 D
  2.    process line
复制代码
4 m  b6 K$ B" m, W" a

' h- Q+ K+ [8 p; z( D- ^0 n% y3.写文件
/ V! y/ [' y" }
9 Z" o5 j" K5 {3 j9 r写文本文件' W  Q9 }* X3 r3 O7 T. ~& n
  1. output = open('data', 'w')
复制代码

# a+ I- S: m- m$ e# c; w( q; }( w2 ]3 z# Z$ J# y' N
写二进制文件
6 v- K7 [7 {9 ?; o
  1. output = open('data', 'wb')
复制代码
( ^& `' W! c9 p/ q% X

6 E3 S  X: b$ \% |+ Q追加写文件# ~) m1 m& M4 a8 ]) [: t3 l
  1. output = open('data', 'w+')
复制代码

9 @% E" a8 C+ b
+ ^9 q/ o: D( P写数据/ i9 A0 @& q/ Q: |4 U
  1. file_object = open('thefile.txt', 'w')% o2 Z* Y: s6 F- @) P' a" `* [' T
  2. file_object.write(all_the_text)* v5 \$ ~7 |& L( A! H. P
  3. file_object.close( )
复制代码
, W) q% ?1 t( \) }

- T8 x0 o) p/ d" I; [' h9 f写入多行
! J: Q8 c! y7 y+ c& G. \. s
  1. file_object.writelines(list_of_text_strings)
复制代码
4 j2 f5 Y$ A3 {3 Z- B$ v

* k% u, P$ I9 L1 j2 e; N注意,调用writelines写入多行在性能上会比使用write一次性写入要高。+ i5 I* X) W: N, x* p
) L% q0 r' U5 `9 F) p
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
, R: Z/ L) F3 l2 ^0 @在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:3 a3 d1 E: C5 g. V2 A- |
  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)
复制代码
3 ]% p# Y5 T. ^8 o; R* t
每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
) K4 ~* l; K3 V7 j5 R0 b. P( a' \) o# x( u( S0 v& @
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
4 l- D8 v/ \) B: ~0 r  o* N& h1 X) I2 ?: T( y! [
  1. file(name[, mode[, buffering]])
复制代码

7 t- J% U+ }# m/ t6 ]3 ufile()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。8 s! H# {9 e! `& w: w3 D# e* a
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n',用U模式打开文件,就是支持所有的换行模式,也就说‘\r' '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。6 J9 F0 ^/ j, l6 {' ?/ m: y  f
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。% [  h2 l* z( x+ ~) Y
* V# x" y* _* K. |. E5 v: }
file对象有自己的属性和方法。先来看看file的属性。; b7 _% A5 F4 z$ Y" H3 v
; W7 H& ]: i% }
closed #标记文件是否已经关闭,由close()改写
! ]9 s- |7 q4 \" p5 hencoding #文件编码
" B+ ~. i& u: w9 F6 S( _! Kmode #打开模式
9 {+ Q+ s1 o! T# Rname #文件名& F: {2 \; f. V& w( y
newlines #文件中用到的换行模式,是一个tuple
5 U! a2 n. s( x% n& w! isoftspace #boolean型,一般为0,据说用于print
/ Z2 e0 R: A0 u/ D  N" \8 ?9 r. g. q5 z! G5 H
file的读写方法:
  q: r8 H& Y# x3 H0 r) Q& K) r% v9 y! u0 A3 c: z; T( M0 Y2 I0 A
F.read([size]) #size为读取的长度,以byte为单位
& m  y' u# ?# Z# W* e2 K" J7 Q2 ?F.readline([size])3 c0 P1 e4 @8 Q  [3 k) ]
#读一行,如果定义了size,有可能返回的只是一行的一部分
( J3 j  n+ h3 UF.readlines([size])$ ~$ Q2 J5 b- |$ j" O- t
#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。3 T3 S( ^: d7 r# L  N+ d. @- [
F.write(str)
# l8 `6 ~. \: O. F% F9 Y# F, p* w: l#把str写到文件中,write()并不会在str后加上一个换行符0 p! k- g) T8 n, o
F.writelines(seq)
% w* C! B, n9 T3 D3 ]* A! L#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。, ~  m" R* h; v( v' |
/ @( j1 g/ {, P1 I& o
file的其他方法:- U6 f7 P. ]" h
# `- ?4 f* i2 i* }3 r
F.close()
3 Q! N5 z+ u. {) }2 ^#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError+ |1 U* v. N1 C
F.flush()  @: a. x4 E1 Y8 h; C
#把缓冲区的内容写入硬盘
2 _& G( c% a. P$ M' P: j9 K! IF.fileno()
! z. d- _2 |; J$ `8 @#返回一个长整型的”文件标签“4 G2 o4 y/ l% _6 ?; i
F.isatty()7 x0 `! {# C# R7 k
#文件是否是一个终端设备文件(unix系统中的)4 v) I& k4 m- K
F.tell()& w. i% k. w9 E
#返回文件操作标记的当前位置,以文件的开头为原点
3 s: H& ~' i8 i) \F.next()" J' ?  I: p! k; i% _
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
% m  G+ e* U" R3 b) D( a, ^9 l: KF.seek(offset[,whence]); I  ?) l( @8 Y& |/ s9 s6 S
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。$ }: f, }, i1 y( o0 f$ S
F.truncate([size])
- l6 r/ {! O8 |  ~$ e* l, {#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。' v, L# j3 t5 J  D
5 S3 A: P! P) [# T  ^6 v
总结
3 n) P1 R1 k7 D7 Q1 J) ?1 [% f, ~4 t3 C' p4 x# ^
以上所述是小编给大家介绍的python 实现创建文件夹和创建日志文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-9 00:19 , Processed in 0.082451 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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