Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块
目录
Pycharm使用技巧(转载)
Python第一天 安装 shell 文件
Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化
Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典
Python第四天 流程控制 if else条件判断 for循环 while循环
Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数
Python第六天 类型转换
Python第七天 函数 函数参数 函数变量 函数返回值 多类型传值 冗余参数 函数递归调用 匿名函数 内置函数 列表表达式/列表重写
Python第八天 模块 包 全局变量和内置变量__name__ Python path
Python第九天 面向对象 类定义 类的属性 类的方法 内部类 垃圾回收机制 类的继承 装饰器
Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 标准错误 重定向 输出流和输入流
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 生成器 walk模块 hashlib模块
Python第十二天 收集主机信息 正则表达式 无名分组 有名分组
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
注意:python里windows的路径要写成 /
f = open('F:/a.txt', 'a') #以写的方式打开
Python文件访问
1、内置函数 open
open
访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
x 打开一个文件只用于写入。如果该文件已存在则抛出异常。如果该文件不存在,创建新文件。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
with open :python2.6才有的方法,python2.5没有,用with open,退出with open代码块之后的代码不需要显式fd.close()
startswith函数、split函数
split(self, sep=None, maxsplit=None)
If maxsplit is given, at most maxsplit splits are done.
maxsplit=1,字符串里出现了两个空格,那么只分割第一个空格,第二个空格不做任何处理
startswith(self, prefix, start=None, end=None)
With optional start, test S beginning at that position.
With optional end, stop comparing S at that position.
若不存在会创建新文件的打开方式:a,a+,w,w+
r+:可读可写,若文件不存在,报错,r+进行覆盖写
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ with open('/proc/meminfo') as fd: for line in fd: if line.startswith('MemTotal'): total = line.split()[1] continue if line.startswith('MemFree'): free = line.split()[1] break print "free:%.2f" % (int(free) / 1024.0) + 'M' print "total:%.2f" % (int(total) / 1024.0) + 'M'
文件的方法
fd.close():不执行fd.close(),python程序退出的时候也会close文件
fd.read() 读取文件的所有内容
fd.readline() 一次读取一行
fd.readlines() :将文件的内容保存到列表,列表的一行对应文件的一行,每个元素都会加上一个换行符\n
next():一行一行读取
fd.write() 写字符串到文件中,并返回写入的字符数
fd.writelines() 写一个字符串列表到文件中
for循环访问文件
序列自由解包
假如我想得到文件第一行和最后一行内容,这样即可:
with open('file_name') as f: first, *_, last = f.readlines()
另外:不仅列表是这样,元组和字典等序列都有这样的特性哦。
第一种 readlines全部把文件内容读到内存
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ with open('C:\Users\Administrator\Desktop\mRemoteNG\mRemoteNG-Portable-1.69\CREDITS.TXT') as fd: for line in fd.readlines(): print line,
---------------------------------------------------------------
第二种 一行一行的读到内存 比较节省内存
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ with open('C:\Users\Administrator\Desktop\mRemoteNG\mRemoteNG-Portable-1.69\CREDITS.TXT') as fd: for line in fd: print line if fd.next().startswith('VncSharp'): break
这里的fd是一个对象,有fd.next()方法,是显示文件下一行,那么for i in fd就相当于一直在执行fd.next()方法,直到文件结束
2、codecs模块的open函数
import codecs fw = codecs.open('test1.txt','a','utf-8') fw.write(line2)
或
import codecs with codecs.open('3.txt', 'rb', 'utf-8') as fd: a=fd.readline() print a
#-*- encoding: gb2312 -*- import codecs, sys # 用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode bfile = codecs.open("dddd.txt", 'r', "big5") #bfile = open("dddd.txt", 'r') ss = bfile.read() bfile.close() # 输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数来打开文件,这里看到的必定是乱码 print ss, type(ss)
while循环访问文件
#!/usr/bin/env python # -*- coding:utf-8 -*- #__author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ with open('C:\Users\Administrator\Desktop\mRemoteNG\mRemoteNG-Portable-1.69\CREDITS.TXT') as fd: while True: line = fd.readline() print line, if not line: break
替换文件内容,两个文件同时使用上下文管理器
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author : huazai # @Time : 2018/5/31 10:45 # @File : aa.py # @Description : import codecs import re import os def sub_string(): ''' 替换字符串 :return: ''' with codecs.open('/etc/redis.conf') as f1, codecs.open('/etc/redis.conf.bak', "w") as f2: content = ''.join(f1.readlines()) content = re.sub(r'\nbind 127.0.0.1', '\nbind {}'.format('1.1.1.1'), content, count=1) f2.write(content) os.remove('/etc/redis.conf') os.rename('/etc/redis.conf.bak', '/etc/redis.conf') def sub_cap(): ''' 将每个单词首字母转为大写 :return: ''' with codecs.open('/etc/redis.conf') as f1, codecs.open('/etc/redis.conf.bak', "w") as f2: for line in f1: f2.write(" ".join([word.capitalize() for word in line.split()])) f2.write('\n') os.remove('/etc/redis.conf') os.rename('/etc/redis.conf.bak', '/etc/redis.conf') if __name__ == '__main__': sub_cap() sub_string()
返回某一行的内容
linecache模块
import linecache print linecache.getline('3.txt',2) # 返回文件的第二行的内容 print linecache.getlines('3.txt') #返回文件的所有内容
在一个2c4g的服务器上如何用python操作8GB的超大文件,知数堂2019-4-10
在一个2c4g的服务器上如何用python操作8GB的超大文件 1、使用with open的方式,for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,并且能够自动关闭文件,推荐该方式 举例: with open('filename') as f: for line in f: do_things(line) 2、open file的方式,可以通过read(size)指定每次读取的大小,将大文件切割成小文件来读取,每次处理完小块即释放内存 举例: f = open(filePath) while True: content = f.read(chunk_size) do_things(content) 3、linecache模块,可以指定读取文件某一行 举例: content = linecache.getline('filename', linenum) do_things(content)
filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具
python标准库还提供了difflib模块用于比较文件的内容
filecmp.cmp(f1, f2[, shallow])
比较两个文件的内容是否匹配。
参数f1,f2指定要比较的文件的路径。可选参数shallow指定比较文件时是否需要考虑文件本身的属性(通过os.stat函数可以获得文件属性)。
如果文件内容匹配,函数返回True,否则返回False。
r = filecmp.cmp('F:\\temp\\py\\bisect2.py', 'F:\\temp\\py\\bisect2.py') print(r)
filecmp.cmpfiles(dir1, dir2, common[, shallow]):
比较两个文件夹内指定文件是否相等。
参数dir1,dir2指定要比较的文件夹,参数common指定要比较的文件名列表。函数返回包含3个list元素的元组,分别表示匹配、不匹配以及错误的文件列表。
错误的文件指的是不存在的文件,或文件被琐定不可读,或没权限读文件,或者由于其他原因访问不了该文件。
dir1 = 'F:\\temp\\py\\dir1' dir2 = 'F:\\temp\\py\\dir2' r = filecmp.cmpfiles(dir1, dir2, ['difflib1.py', 'difflib5.py', 'test1.txt']) print(r)
dircmp类
用于比较文件夹,通过该类比较两个文件夹,可以获取一些详细的比较结果(如只在A文件夹存在的文件列表),并支持子文件夹的递归比较。
dircmp提供了三个方法用于报告比较的结果
report():只比较指定文件夹中的内容(文件与文件夹)
report_partial_closure():比较文件夹及第一级子文件夹的内容
report_full_closure():递归比较所有的文件夹的内容
dircmp还提供了下面这些属性用于获取比较的详细结果
left_list:左边文件夹中的文件与文件夹列表;
right_list:右边文件夹中的文件与文件夹列表;
common:两边文件夹中都存在的文件或文件夹;
left_only:只在左边文件夹中存在的文件或文件夹;
right_only:只在右边文件夹中存在的文件或文件夹;
common_dirs:两边文件夹都存在的子文件夹;
common_files:两边文件夹都存在的子文件;
common_funny:两边文件夹都存在的子文件夹;
same_files:匹配的文件;
diff_files:不匹配的文件;
funny_files:两边文件夹中都存在,但无法比较的文件;
subdirs: