文件操作

  文件操作一般分为三步:打开文件得到文件句柄并赋值给一个变量--->通过句柄对文件进行操作-->关闭文件

f=open(r'C:\Users\hesha\PycharmProjects\Sat_20171216\practice__file\a.txt','r',encoding='utf-8')
data=f.read()
f.close()
open()参数包括文件路径(r''代表原生路径),文件操作(如果为r则默认rt模式)和编码方式

  文件操作关键两点:字符编码和资源回收。我们可以使用with关键字来帮助我们管理上下文

with open('a.txt','r',encoding='utf-8') as f:
data=f.read() #读取所有内容
print(data)

文件打开方式

  文件句柄=open('文件路径',‘模式’)

  模式可以是以下方式以及他们之间的组合

character meaning
'r' open for reading(default)
'w' open for writing,truncating the file list
'a' open for writing,appending to the end of the file if it exist
'b' binary mode
't' text mode
'+' open a disk file for updating(reading and writing)
'U' universal newline mode(for backwards compatibility;should not be used in new code)

  r(rt):只读文本模式;w(wt):只写文本模式;a(at):只追加文本模式

  b模式:对于非文本文件,我们只能用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码方式,图片文件的jgp格式、视频文件的avi格式),以b模式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

  '+':表示可以同时读写某个文件

  'x':只写模式

  ‘U’:表示在读取时,"U"表示在读取时,可以将\r \n \r\n自动转换成\n(与r或者r+模式同时使用)因为Windows系统的换行符为\r\n,Linux系统的换行符为\n,加上U则能自动把\r\n转换成\n

  'w'和'x'的区别:w为只写模式,不存在则创建,存在则清空内容;x为只写模式,不存在则创建,存在则报错

  'r+'与'w+'的区别:r+可读可写,若文件不存在,报错;w+可读可写,若文件不存在,创建

  'r+'与'a+'的区别:r+覆盖写,a+追加写

文件读写

  读文件:f.read(),f.readline(),f.readlines()

#read,realine和readlines用法
with open('a.txt','r',encoding='utf-8') as f:
data=f.read() #读取所有内容
print(data) with open('a.txt','r',encoding='utf-8') as f:
data1=f.readline() #读取文件每一行内容
print(data1,end='') #print()函数自带换行,使用end=''去掉换行
data2=f.readline()
print(data2)
data3=f.readline()
print(data3) with open('a.txt','r',encoding='utf-8') as f:
data=f.readlines() #读取文件每一行内容并存入列表
print(data)

  写文件:f.write(),f.writelines()

#'w'模式写文件:没有文件则创建文件,有文件则清空文件,t模式打开的只能写字符串
with open('b.txt','w',encoding='utf-8') as f:
f.write('111\n222\n333\n') #针对't'模式的写,需要添上换行符 with open('b.txt','wb') as f:
f.write('111\n222\n'.encode('utf-8')) #针对'b'模式的写,需要encode并添上换行符 with open('b.txt','w',encoding='utf-8') as f:
f.writelines(['hahahh\n','heiheihei\n','hehehe\n']) #通过列表或元祖的形式写入文件内容 #'a'模式追加写:文件不存在则创建文件,存在则打开文件后将光标移动到文件末尾进行追加写
with open('b.txt','a',encoding='utf-8') as f:
f.write('aaa\nbbb\n') with open('b.txt','r',encoding='utf-8') as f:
for line in f:
print(line,end='')

  'b'模式进行文件写操作时,需要将字符串转换成bytes类型

with open('b.txt','rb') as f:
print(f.read().decode('utf-8')) #将读取的内容编码为utf-8模式 with open('b.txt','wb') as f:
f.write('早'.encode('utf-8')) #将字符串转成bytes类型

文件修改

  修改方法一:将硬盘存放的文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
open('.info.txt.swap','w',encoding='utf-8') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace('a','A') #在内存中完成修改
write_f.write(data) #一次性写入新文件 os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

  修改方法二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
open('.info.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if 'A' in line:
line=line.replace('A','a')
write_f.write(line)
os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

文件内光标的移动

  f.read(3)

  以'r'模式打开文件时,‘3’代表读取3个字符,以'b'模式打开文件时,‘3’代表读取3个字节

  seek(),tell(),truncate()都是以字节为单位

  seek(offset,whence):offset表示开始的偏移量,也就是代表需要移动偏移的字节数,whence给offset参数一个定义,表示从哪个位置开始偏移,0代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起。其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

with open('a.txt','r',encoding='utf-8') as f:
data1=f.read()
print('==1==>',data1)
print(f.tell()) #光标在文件中的位置,只有一种情况是以字符的形式(文件以rt模式打开)
f.seek(6,0) #第二个参数有三种方式,必须在b模式下才可以用1和2模式 1:以当前位置参照 2:以末尾参照

  truncate是截断文件,所以文件的打开方式必须可写为r+或a或a+(不能用w或w+的方式打开,因为那样直接清空文件了)

练习

(1)利用b模式,编写一个cp工具,要求如下:

  既可以拷贝文本又可以拷贝视频,图片等文件;

  用户一旦参数错误,打印命令的正确方法,如usage:cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面的参数

#cp:注意文件大小和打开模式
import sys
#print(sys.argv)
if len(sys.argv) != 3:
print('usage:cp source_file target_file')
sys.exit() _,src_file,dst_file=sys.argv
with open(src_file,'rb') as read_f,\
open(dst_file,'wb') as write_f:
for line in read_f:
write_f.write(line)
write_f.flush()

(2)修改文件内容,把文件中的‘hello’都替换成'bye'

import os
with open('a.txt','r',encoding='utf-8') as read_f,\
open('.a.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if 'hello' in line:
line=line.replace('hello','bye')
write_f.write(line) os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

(3)文件a.txt内容:每一行内容分别为商品,价钱,个数,并已空格分隔

  apple 10 3

  peach 8 4

  cherry 18 5

  orange 27 7

  求出本次购物花费的总钱数

sum=0
with open('a.txt','r',encoding='utf-8') as f:
for line in f:
line_l=line.split()
#print(line_l)
price=int(line_l[1])
num=int(line_l[2])
good_sum=price*num
sum+=good_sum
print('sum is %s'%sum)

  

第四章 Python之文件处理的更多相关文章

  1. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  2. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  3. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  4. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  5. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  6. Python 编程快速上手 第十四章 处理 CSV 文件和 JSON 数据

    前言 这一章分为两个部分,处理 CSV 格式的数据和处理 JSON 格式个数据. 处理 CSV 理解 csv csv 的每一行代表了电子表格中的每一行,每个逗号分开两个单元格csv 的内容全部为文本, ...

  7. 第3章 Python基础-文件操作&函数 文件操作 练习题

    一.利用b模式,编写一个cp工具,要求如下: 1. 既可以拷贝文本又可以拷贝视频,图片等文件 2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target ...

  8. LabWindows/CVI入门之第四章:库文件(转)

    按语: 在参考CVI参考书使用CVI生成动态库后,在另一工程中调用DLL ,编译通不过,后参考此文,豁然开朗. http://blog.sina.com.cn/s/blog_6373e9e60101b ...

  9. 《Python核心编程》 第四章 Python对象- 课后习题

    练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到.  类型:对象的 ...

随机推荐

  1. Module.exports 和 exports

    Module.exports 和 exports 在node中,没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部,那么模块间如何通信 当加载一个模块的时候,被加载模块的代码在第一次 ...

  2. HDU1867 - A + B for you again

    Generally speaking, there are a lot of problems about strings processing. Now you encounter another ...

  3. 关于mvc架构的浅谈

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...

  4. Redis-Cluster集群原理

    一.redis-cluster 官方推荐的 redis 集群解决方案,优点在于去中心化, 去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个 ...

  5. robot Framework控制浏览器

    向下 向上为负值

  6. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  7. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)

        一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...

  8. android 分享到QQ空间的全部操作

    http://wiki.open.qq.com/wiki/mobile/SDK下载   <!-- QZone分享必须加上以下两个activity -->                &l ...

  9. Mac OSX Yosemite 10.10 brew 错误:mktemp: mkdtemp failed on /tmp/git-LIPo: No such file or directory

    这个问题困扰了我非常久非常久.使得我不得不花一点时间来说一下解决方法. 事情是这种:前两天兴高採烈的更新了一下宝贝mac到10.10. 一切看起来都那么美好,可是. .当我又一次安装magento的时 ...

  10. UVA 10859 - Placing Lampposts 树形DP、取双优值

                              Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...