文件操作

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

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. vue .sync修饰符

    .sync 修饰符 对一个 prop 进行“双向绑定”时,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源. 那这个修饰符的原理是什么呢?其实还是vu ...

  2. 【JavaScript框架封装】实现一个类似于JQuery的内容框架的封装

    // 内容框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * .html()用为读 ...

  3. nyoj26-孪生素数问题

    孪生素数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再近的 ...

  4. [poj 3666] Making the Grade (离散化 线性dp)

    今天的第一题(/ω\)! Description A straight dirt road connects two fields on FJ's farm, but it changes eleva ...

  5. Linux安装expect命令

    [Linux安装expect命令]:--expect是在Tcl基础上创建起来的,所以在安装expect前我们应该先安装Tcl.①:tcl安装源码下载:http://www.tcl.tk/softwar ...

  6. maven引入jsp相关依赖

    <!--引入Servlet开始--> <dependency> <groupId>javax.servlet</groupId> <artifac ...

  7. solrj 操作 solr 单机版

    一.导入 jar 包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr- ...

  8. 监控Oracle计数器

  9. LaTeX soul包

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50774955 详细的soul包的官方P ...

  10. 流媒体播放器VLC SDL

    http://www.cnblogs.com/lihuixian001/archive/2013/03/15/2957103.html https://wiki.videolan.org/Win32C ...