Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

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()

 

 

https://www.birdpython.com/posts/2/44/
文件对象
像 open 函数返回的需要用 read 函数读取数据的对象,在 Python 中统称为 file-like Object。除了 file ,还可以是内存的字节流,网络流,自定义流等等。file-like Object 不要求从特定类继承,只要写个 read 函数就行。
我们后面会学习各种文件对象,特别是在网络编程中,我们要学习的套接字也是文件对象,套接字的 read 函数是从网卡中读入字节流,write 函数是告诉操作系统把字节流写入到网卡,这样就可以和远程机器进行通信了。

 

 

startswith函数、split函数 、splitlines函数

str.splitlines([keepends]) 
按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

str1 = 'ab c\n\nde fg\rkl\r\n'
print str1.splitlines();

 

str.split(self, sep=None, maxsplit=None)
If maxsplit is given, at most maxsplit splits are done.
maxsplit=1,字符串里出现了两个空格,那么只分割第一个空格,第二个空格不做任何处理

txt = "Google#Runoob#Taobao#Facebook"
 
# 第二个参数为 1,返回两个参数列表
x = txt.split("#", 1)

 

str.rsplit(self, sep=None, maxsplit=None)
跟split一样,只不过rsplit是从右开始切

txt = "Google#Runoob#Taobao#Facebook"
 
# 第二个参数为 1,返回两个参数列表
x = txt.rsplit("#", 1)

 

 

str.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:



posted @ 2017-01-17 17:02  桦仔  阅读(1960)  评论(0编辑  收藏  举报