设为首页 收藏本站
查看: 1080|回复: 0

[经验分享] CrazyWing:Python自动化运维开发实战 十三、Python文件I/O-CrazyWing

[复制链接]

尚未签到

发表于 2018-8-3 10:50:52 | 显示全部楼层 |阅读模式
打开和关闭文件:
  可以用 file 对象做大部分的文件操作。

open 函数:
  先用open()函数打开一个文件,创建一个file对象,再用相关的方法才可以调用它进行读写。
  open() 和 file() 功能相同, 可以任意替换。
  任何使用 open() 的地方, 都可以使用 file() 替换它,建议用open()
  语法:
  

file object = open(file_name [, access_mode][, buffering])   

  参数说明:
  

file_name:  
file_name变量是一个包含了你要访问的文件名称的字符串值。
  

  
access_mode:
  
决定打开文件的模式:只读,写入,追加等,所有可取值见后面的完全列表,这个参数是非强制的
  
默认文件访问模式为只读(r).通常, 文件使用模式 'r', 'w', 或是 'a'模式来打开, 分别代表读取, 写入
  
和追加
  

  
buffering:
  如果buffering的值被设为0,就不会有寄存。
  如果buffering的值取1,访问文件时会寄存行。
  如果将buffering的值设为大于1的整数,表明这就是的寄存区的缓冲大小。
  如果取负值,寄存区的缓冲大小则为系统默认。
  

  例1.
  >>> f = open('c.txt','w',0)     #没有缓冲
  >>> f.write('hello world')       #close之前打开另一终端观察文件发现已经写入进
  去,说明关闭文件之前就已经写到硬盘
  >>> f.close()
  

  例2.
  >>> f = open('d.txt','w',1)     #有缓冲
  >>> f.write('hello world')       #close之前打开另一终端观察文件发现没有写入进
  去,说明关闭文件之前没有写到硬盘
  >>> f.close()
  

  例3.
  >>> f = open('e.txt','w',5)     #设置缓冲区大小,wing发现没有管用,跟没有缓冲
  效果是一样的
  >>> f.write('hello world')
  

  例4.
  >>> f = open('f.txt','w',-1)     #设置缓存区大小为默认,发现有缓冲
  >>> f.write('hello world')
  >>> f.close()
  一般情况下缓冲使用系统默认方式即可.
  

  不同模式打开文件的完全列表:
  

| 模式 | 描述 |  
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。以这种模式打开的文件必须是已经存在的(U模式也是) |
  
| rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
  
| r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。注意这个模式默认是带缓冲的 |
  
| rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
  
| w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
  
| wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
  
| w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
  
| wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
  
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后即使你 seek 到了其它的地方。如果该文件不存在,创建新文件进行写入。 |
  
| ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
  
| a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
  
| ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
  

  通用换行符支持(UNS):
  

还有一个特殊的模式U,不同平台用来表示行结束的符号是不同的, 例如 \n, \r, 或者 \r\n.当你使用 'U' 标志打开文件的时候, 所有的行分割符(或行结束符, 无论它原来是什么)通过 Python 的输入方法(例如 read*() )返回时都会被替换为换行符 NEWLINE(\n).注意 UNS 只用于读取文本文件. 没有对应的处理文件输出的方法.  可以使用U,rU或Ua模式打开文件
  

  关于 'b' 的说明:
  

对于所有 POSIX 兼容的 Unix 系统(包括Linux)来说, 'b'是可由可无的, 因为它们把所有的文件当作二进制文件, 包括文本文件.  
下面是从 Linux 手册的 fopen() 函数使用中摘录的一段, Python 语言中的 open() 函数就是从它衍生出的:
  
指示文件打开模式的字符串中也可以包含字符 "b" , 但它不能做为第一个字符出现.
  
这样做的目的是为了严格地满足 ANSI C3.159-1989 (即 ANSI C)中的规定。
  
事实上它没有任何效果, 所有POSIX 兼容系统, 包括 Linux , 都会忽略 "b" ,其它系统可能会区分文本文件和二进制文件, 如果你要处理一个二进制文件, 并希望你的程序可以移植到其它非 Unix 的环境中, 加上"b" 会是不错的主意
  

File对象的属性
  一个文件被打开后,你就会拥有一个file对象,你可以得到有关该文件的各种信息。
  file对象属性列表:
  

| 属性 | 描述 |  
| file.closed | 返回true如果文件已被关闭,否则返回false。 |
  
| file.mode | 返回被打开文件的访问模式。 |
  
| file.name | 返回文件的名称。 |
  
| file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。一般程序员用不着,由程序内部使用。 |
  

  例:
  

#!/usr/bin/python  
#打开一个文件
  
fo = open("foo.txt", "w")
  
print "文件名: ", fo.name
  
print "是否已关闭 : ", fo.closed
  
print "访问模式 : ", fo.mode
  
print "末尾是否强制加空格 : ", fo.softspace
  

  
输出结果:
  
文件名:  foo.txt
  
是否已关闭 :  False
  
访问模式 :  w
  
末尾是否强制加空格 :  0
  

  close()方法:
  

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。  
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件
  

  
语法:
  fileObject.close()
  
例:
  #!/usr/bin/python
  fo = open("foo.txt", "w")
  print "文件名: ", fo.name
  fo.close()      # 关闭打开的文件
  

  输出结果:
  文件名:  foo.txt
  

读文件方法: read()  readline()   readlines()

read():返回字符串
  

从一个打开的文件中读取一个字符串。  
fileObject.read([count])
  被传递的参数count是要从已打开文件中读取的字节计数。
  
该方法从文件的开头开始读入,如果没有传入count参数(默认值为 -1)或者值为负, 文件将被
  
读取到末尾.
  

  #!/usr/bin/python
  fo = open("foo.txt", "r+")
  str = fo.read(10);
  print "读取的字符串是 : ", str
  fo.close()
  

  输出结果:
  读取的字符串是 :  www.fklinu
  

readline():返回字符串
  

读取下个行结束符之前的所有字节. 作为字符串返回整行,包括行结束符。
  
和 read() 相同, 它也有一个可选的>
  
提供了该参数, 那么在超过>  

readlines():返回字符串列表
  

读取所有剩余的行,返回一个字符串列表。  

写文件方法:write()  writelines()

write()
  

可将任何字符串(包括二进制数据)写入一个打开的文件,不会在字符串的结尾添加换行符('\n')  

writelines()
  

是针对列表的操作, 它接受一个字符串序列(字符串,字符串列表,字符串元组)作为参数, 将它们写入文件. 行结束符并不会被自动加入, 所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行结束符.  

  语法:
  fileObject.write(string)
  string参数是要写入到已打开文件的内容。
  

#!/usr/bin/python  fo = open("foo.txt", "w")
  fo.write( "www.fklinux.com!\nVery good site!\n");
  fo.close() # 关闭打开的文件
  

  
被创建的foo.txt文件内容:
  # cat foo.txt
  www.fklinux.com!
  Very good site!
  

文件内移动:

tell()方法:
  

这个方法告诉我们文件内的当前位置,换句话说,下一次的读写会发生在文件开头这么多字节之  
后。
  

seek()方法:
  

可以在文件中移动文件指针到不同的位置.  
语法:
  
seek(offset [,from])
  

  
offset变量表示要移动的字节数
  
from变量指定开始移动字节的参考位置。
  如果from被设为0,这意味着将文件的开头作为移动字节的参考位置
  如果设为1,则使用当前的位置作为参考位置
  如果设为2,那么该文件的末尾将作为参考位置
  

  
seek配置r+模式可以实现从指定位置修改文件
  

  例:
  就用上面创建的文件foo.txt。
  #!/usr/bin/python
  fo = open("foo.txt", "r+")
  str = fo.read(10);
  print "读取的字符串是 : ", str
  

# 查找当前位置  position = fo.tell();
  print "当前文件位置 : ", position
  

  # 把指针再次重新定位到文件开头
  position = fo.seek(0, 0);
  str = fo.read(10);
  print "重新读取字符串 : ", str
  # 关闭打开的文件
  fo.close()
  

  输出结果:
  读取的字符串是 :  www.fklinu
  当前文件位置 :  10
  重新读取字符串 :  www.fklinu
  

  文件迭代:
  一行一行访问文件很简单:
  for eachLine in f:
  :
  

此循环里, eachLine 代表文本文件的一行(包括末尾的行结束符),你可以使用它做任何想做的事情.  
在 Python 2.2 中, 引进了迭代器和文件迭代,  文件对象成为了它们自己的迭代器
  
意味着用户不必调用 read*() 方法就可以在 for 循环中迭代文件的每一行.
  
另外也可使用迭代器的 next 方法, file.next() 可以用来读取文件的下一行.
  
和其它迭代器一样, Python 也会在所有行迭代完成后引发 StopIteration 异常.
  

  
迭代器之前的老方法:
  
for eachLine in f.readline():
  :
  

其他:
  flush() 方法
  会直接把内部缓冲区中的数据立刻写入文件, 而不是被动地等待输出缓冲区被写入.
  truncate() 方法

  将文件截取到当前文件指针位置或者到给定>
  它接受一个可选的>
重命名和删除文件
  Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
  rename()方法:
  需要两个参数,当前的文件名和新文件名。
  语法:
  os.rename(current_file_name, new_file_name)
  例子: 下例将重命名一个已经存在的文件test1.txt。
  #!/usr/bin/python
  import os
  os.rename( "test1.txt", "test2.txt" )          # 重命名文件test1.txt到test2.txt。
  remove()方法:
  你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
  语法:
  os.remove(file_name)
  例子: 下例将删除一个已经存在的文件test2.txt。
  #!/usr/bin/python
  import os
  os.remove("test2.txt")  # 删除一个已经存在的文件test2.txt

Python里的目录:
  os模块有许多方法能帮你创建,删除和更改目录。
  mkdir()方法:
  使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
  语法:
  os.mkdir("newdir")
  例子: 下例将在当前目录下创建一个新目录test。
  #!/usr/bin/python
  import os
  os.mkdir("test")        # 创建目录test
  chdir()方法:
  可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
  语法:
  os.chdir("newdir")
  例子: 下例将进入"/home/newdir"目录。
  #!/usr/bin/python
  import os
  os.chdir("/home/newdir")  # 将当前目录改为"/home/newdir"
  getcwd()方法:
  getcwd()方法显示当前的工作目录。
  语法:
  os.getcwd()
  例子: 下例给出当前目录:
  #!/usr/bin/python
  import os
  os.getcwd()  # 给出当前的目录
  rmdir()方法 :
  rmdir()方法删除目录,目录名称以参数传递。 在删除这个目录之前,它的所有内容应该先被清除。
  语法:
  os.rmdir('dirname')
  例子: 以下是删除" /tmp/test"目录的例子,目录的完全合规名称必须被给出,否则会在当前目录下搜索该目录。
  #!/usr/bin/python
  import os
  os.rmdir( "/tmp/test"  )  # 删除”/tmp/test”目录

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-545796-1-1.html 上篇帖子: Python火车票代码 下篇帖子: python获取天气+email通知
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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