文件操作

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

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. springboot-注解讲解

    @Configuration:声明我们JdbcConfig是一个配置类 @PropertySource:指定属性文件的路径是:classpath:jdbc.properties 通过@Value为属性 ...

  2. Zabbix系列-REHL6.10离线方式安装Zabbix 4.0 LTS

    环境 第零步:关闭系统默认防火墙 setenforce 0 sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/confi ...

  3. Nginx负载均衡health_check分析

    在Nginx负载均衡中,我们很难保证说每一台应用服务器都能一直正常的运行下去.但是我们可以通过设置Nginx来检测这些应用服务器,检测这些服务器当中不能访问的. Nginx的检测方式分为两种,一种是被 ...

  4. F5 datasheet

  5. Linux搭建Jenkins

    1.添加存储库 yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令: 使用wget -O下载并以不同的文件名保存 [root@besttes ...

  6. python面向对象三大特性之一封装

    一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...

  7. jenkins 新增节点的3种方式

    1.通过ssh建立节点(在节点机子上要安装好jdk) (1)通过用户+密码建立ssh连接 (2)通过用户+密钥建立连接 2.通过jnlp,javaweb的方式连接 (1)创建好节点 (2)在节点的机子 ...

  8. Problem 6

    Problem 6 # Problem_6.py """ The sum of the squares of the first ten natural numbers ...

  9. Python 使用matplotlib模块模拟掷骰子

    掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""&quo ...

  10. python开发项目:学生选课系统

    程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...